import { createApp, reactive, getCurrentInstance, defineComponent, computed, openBlock, createElementBlock, normalizeStyle, normalizeClass, createElementVNode, Fragment, renderList, createCommentVNode, renderSlot, ref, watch, resolveComponent, createBlock, Transition, withCtx, toDisplayString, createTextVNode, createVNode, mergeProps, resolveDirective, withDirectives, onUnmounted, withModifiers, onBeforeUnmount, watchEffect, onMounted, nextTick, createSlots, inject, vShow, provide, isVNode, onActivated, onDeactivated, useSlots, withKeys, vModelDynamic, h, onUpdated, onBeforeUpdate } from "vue";
import { useTransition, TransitionPresets, useScroll, useDocumentVisibility, useInfiniteScroll } from "@vueuse/core";
import FanLazyload from "vue-lazyload";
import Swiper$2, { Pagination, Autoplay, Controller } from "swiper";
const aspectRatioSfc = "";
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
var clipboard = { exports: {} };
/*!
 * clipboard.js v2.0.11
 * https://clipboardjs.com/
 *
 * Licensed MIT © Zeno Rocha
 */
(function(module, exports) {
  (function webpackUniversalModuleDefinition(root, factory) {
    module.exports = factory();
  })(commonjsGlobal, function() {
    return (
      /******/
      function() {
        var __webpack_modules__ = {
          /***/
          686: (
            /***/
            function(__unused_webpack_module, __webpack_exports__, __webpack_require__2) {
              __webpack_require__2.d(__webpack_exports__, {
                "default": function() {
                  return (
                    /* binding */
                    clipboard2
                  );
                }
              });
              var tiny_emitter = __webpack_require__2(279);
              var tiny_emitter_default = /* @__PURE__ */ __webpack_require__2.n(tiny_emitter);
              var listen = __webpack_require__2(370);
              var listen_default = /* @__PURE__ */ __webpack_require__2.n(listen);
              var src_select = __webpack_require__2(817);
              var select_default = /* @__PURE__ */ __webpack_require__2.n(src_select);
              function command(type) {
                try {
                  return document.execCommand(type);
                } catch (err) {
                  return false;
                }
              }
              var ClipboardActionCut = function ClipboardActionCut2(target) {
                var selectedText = select_default()(target);
                command("cut");
                return selectedText;
              };
              var actions_cut = ClipboardActionCut;
              function createFakeElement(value) {
                var isRTL = document.documentElement.getAttribute("dir") === "rtl";
                var fakeElement = document.createElement("textarea");
                fakeElement.style.fontSize = "12pt";
                fakeElement.style.border = "0";
                fakeElement.style.padding = "0";
                fakeElement.style.margin = "0";
                fakeElement.style.position = "absolute";
                fakeElement.style[isRTL ? "right" : "left"] = "-9999px";
                var yPosition = window.pageYOffset || document.documentElement.scrollTop;
                fakeElement.style.top = "".concat(yPosition, "px");
                fakeElement.setAttribute("readonly", "");
                fakeElement.value = value;
                return fakeElement;
              }
              var fakeCopyAction = function fakeCopyAction2(value, options) {
                var fakeElement = createFakeElement(value);
                options.container.appendChild(fakeElement);
                var selectedText = select_default()(fakeElement);
                command("copy");
                fakeElement.remove();
                return selectedText;
              };
              var ClipboardActionCopy = function ClipboardActionCopy2(target) {
                var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
                  container: document.body
                };
                var selectedText = "";
                if (typeof target === "string") {
                  selectedText = fakeCopyAction(target, options);
                } else if (target instanceof HTMLInputElement && !["text", "search", "url", "tel", "password"].includes(target === null || target === void 0 ? void 0 : target.type)) {
                  selectedText = fakeCopyAction(target.value, options);
                } else {
                  selectedText = select_default()(target);
                  command("copy");
                }
                return selectedText;
              };
              var actions_copy = ClipboardActionCopy;
              function _typeof(obj) {
                "@babel/helpers - typeof";
                if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
                  _typeof = function _typeof2(obj2) {
                    return typeof obj2;
                  };
                } else {
                  _typeof = function _typeof2(obj2) {
                    return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
                  };
                }
                return _typeof(obj);
              }
              var ClipboardActionDefault = function ClipboardActionDefault2() {
                var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
                var _options$action = options.action, action = _options$action === void 0 ? "copy" : _options$action, container = options.container, target = options.target, text = options.text;
                if (action !== "copy" && action !== "cut") {
                  throw new Error('Invalid "action" value, use either "copy" or "cut"');
                }
                if (target !== void 0) {
                  if (target && _typeof(target) === "object" && target.nodeType === 1) {
                    if (action === "copy" && target.hasAttribute("disabled")) {
                      throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
                    }
                    if (action === "cut" && (target.hasAttribute("readonly") || target.hasAttribute("disabled"))) {
                      throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`);
                    }
                  } else {
                    throw new Error('Invalid "target" value, use a valid Element');
                  }
                }
                if (text) {
                  return actions_copy(text, {
                    container
                  });
                }
                if (target) {
                  return action === "cut" ? actions_cut(target) : actions_copy(target, {
                    container
                  });
                }
              };
              var actions_default = ClipboardActionDefault;
              function clipboard_typeof(obj) {
                "@babel/helpers - typeof";
                if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
                  clipboard_typeof = function _typeof2(obj2) {
                    return typeof obj2;
                  };
                } else {
                  clipboard_typeof = function _typeof2(obj2) {
                    return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
                  };
                }
                return clipboard_typeof(obj);
              }
              function _classCallCheck(instance2, Constructor) {
                if (!(instance2 instanceof Constructor)) {
                  throw new TypeError("Cannot call a class as a function");
                }
              }
              function _defineProperties(target, props) {
                for (var i = 0; i < props.length; i++) {
                  var descriptor = props[i];
                  descriptor.enumerable = descriptor.enumerable || false;
                  descriptor.configurable = true;
                  if ("value" in descriptor)
                    descriptor.writable = true;
                  Object.defineProperty(target, descriptor.key, descriptor);
                }
              }
              function _createClass(Constructor, protoProps, staticProps) {
                if (protoProps)
                  _defineProperties(Constructor.prototype, protoProps);
                if (staticProps)
                  _defineProperties(Constructor, staticProps);
                return Constructor;
              }
              function _inherits(subClass, superClass) {
                if (typeof superClass !== "function" && superClass !== null) {
                  throw new TypeError("Super expression must either be null or a function");
                }
                subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } });
                if (superClass)
                  _setPrototypeOf(subClass, superClass);
              }
              function _setPrototypeOf(o, p) {
                _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) {
                  o2.__proto__ = p2;
                  return o2;
                };
                return _setPrototypeOf(o, p);
              }
              function _createSuper(Derived) {
                var hasNativeReflectConstruct = _isNativeReflectConstruct();
                return function _createSuperInternal() {
                  var Super = _getPrototypeOf(Derived), result;
                  if (hasNativeReflectConstruct) {
                    var NewTarget = _getPrototypeOf(this).constructor;
                    result = Reflect.construct(Super, arguments, NewTarget);
                  } else {
                    result = Super.apply(this, arguments);
                  }
                  return _possibleConstructorReturn(this, result);
                };
              }
              function _possibleConstructorReturn(self2, call) {
                if (call && (clipboard_typeof(call) === "object" || typeof call === "function")) {
                  return call;
                }
                return _assertThisInitialized(self2);
              }
              function _assertThisInitialized(self2) {
                if (self2 === void 0) {
                  throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
                }
                return self2;
              }
              function _isNativeReflectConstruct() {
                if (typeof Reflect === "undefined" || !Reflect.construct)
                  return false;
                if (Reflect.construct.sham)
                  return false;
                if (typeof Proxy === "function")
                  return true;
                try {
                  Date.prototype.toString.call(Reflect.construct(Date, [], function() {
                  }));
                  return true;
                } catch (e) {
                  return false;
                }
              }
              function _getPrototypeOf(o) {
                _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o2) {
                  return o2.__proto__ || Object.getPrototypeOf(o2);
                };
                return _getPrototypeOf(o);
              }
              function getAttributeValue(suffix, element) {
                var attribute = "data-clipboard-".concat(suffix);
                if (!element.hasAttribute(attribute)) {
                  return;
                }
                return element.getAttribute(attribute);
              }
              var Clipboard = /* @__PURE__ */ function(_Emitter) {
                _inherits(Clipboard2, _Emitter);
                var _super = _createSuper(Clipboard2);
                function Clipboard2(trigger, options) {
                  var _this;
                  _classCallCheck(this, Clipboard2);
                  _this = _super.call(this);
                  _this.resolveOptions(options);
                  _this.listenClick(trigger);
                  return _this;
                }
                _createClass(Clipboard2, [{
                  key: "resolveOptions",
                  value: function resolveOptions() {
                    var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
                    this.action = typeof options.action === "function" ? options.action : this.defaultAction;
                    this.target = typeof options.target === "function" ? options.target : this.defaultTarget;
                    this.text = typeof options.text === "function" ? options.text : this.defaultText;
                    this.container = clipboard_typeof(options.container) === "object" ? options.container : document.body;
                  }
                  /**
                   * Adds a click event listener to the passed trigger.
                   * @param {String|HTMLElement|HTMLCollection|NodeList} trigger
                   */
                }, {
                  key: "listenClick",
                  value: function listenClick(trigger) {
                    var _this2 = this;
                    this.listener = listen_default()(trigger, "click", function(e) {
                      return _this2.onClick(e);
                    });
                  }
                  /**
                   * Defines a new `ClipboardAction` on each click event.
                   * @param {Event} e
                   */
                }, {
                  key: "onClick",
                  value: function onClick(e) {
                    var trigger = e.delegateTarget || e.currentTarget;
                    var action = this.action(trigger) || "copy";
                    var text = actions_default({
                      action,
                      container: this.container,
                      target: this.target(trigger),
                      text: this.text(trigger)
                    });
                    this.emit(text ? "success" : "error", {
                      action,
                      text,
                      trigger,
                      clearSelection: function clearSelection() {
                        if (trigger) {
                          trigger.focus();
                        }
                        window.getSelection().removeAllRanges();
                      }
                    });
                  }
                  /**
                   * Default `action` lookup function.
                   * @param {Element} trigger
                   */
                }, {
                  key: "defaultAction",
                  value: function defaultAction(trigger) {
                    return getAttributeValue("action", trigger);
                  }
                  /**
                   * Default `target` lookup function.
                   * @param {Element} trigger
                   */
                }, {
                  key: "defaultTarget",
                  value: function defaultTarget(trigger) {
                    var selector = getAttributeValue("target", trigger);
                    if (selector) {
                      return document.querySelector(selector);
                    }
                  }
                  /**
                   * Allow fire programmatically a copy action
                   * @param {String|HTMLElement} target
                   * @param {Object} options
                   * @returns Text copied.
                   */
                }, {
                  key: "defaultText",
                  /**
                   * Default `text` lookup function.
                   * @param {Element} trigger
                   */
                  value: function defaultText(trigger) {
                    return getAttributeValue("text", trigger);
                  }
                  /**
                   * Destroy lifecycle.
                   */
                }, {
                  key: "destroy",
                  value: function destroy() {
                    this.listener.destroy();
                  }
                }], [{
                  key: "copy",
                  value: function copy(target) {
                    var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {
                      container: document.body
                    };
                    return actions_copy(target, options);
                  }
                  /**
                   * Allow fire programmatically a cut action
                   * @param {String|HTMLElement} target
                   * @returns Text cutted.
                   */
                }, {
                  key: "cut",
                  value: function cut(target) {
                    return actions_cut(target);
                  }
                  /**
                   * Returns the support of the given action, or all actions if no action is
                   * given.
                   * @param {String} [action]
                   */
                }, {
                  key: "isSupported",
                  value: function isSupported() {
                    var action = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ["copy", "cut"];
                    var actions = typeof action === "string" ? [action] : action;
                    var support = !!document.queryCommandSupported;
                    actions.forEach(function(action2) {
                      support = support && !!document.queryCommandSupported(action2);
                    });
                    return support;
                  }
                }]);
                return Clipboard2;
              }(tiny_emitter_default());
              var clipboard2 = Clipboard;
            }
          ),
          /***/
          828: (
            /***/
            function(module2) {
              var DOCUMENT_NODE_TYPE = 9;
              if (typeof Element !== "undefined" && !Element.prototype.matches) {
                var proto = Element.prototype;
                proto.matches = proto.matchesSelector || proto.mozMatchesSelector || proto.msMatchesSelector || proto.oMatchesSelector || proto.webkitMatchesSelector;
              }
              function closest(element, selector) {
                while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
                  if (typeof element.matches === "function" && element.matches(selector)) {
                    return element;
                  }
                  element = element.parentNode;
                }
              }
              module2.exports = closest;
            }
          ),
          /***/
          438: (
            /***/
            function(module2, __unused_webpack_exports, __webpack_require__2) {
              var closest = __webpack_require__2(828);
              function _delegate(element, selector, type, callback, useCapture) {
                var listenerFn = listener.apply(this, arguments);
                element.addEventListener(type, listenerFn, useCapture);
                return {
                  destroy: function() {
                    element.removeEventListener(type, listenerFn, useCapture);
                  }
                };
              }
              function delegate(elements, selector, type, callback, useCapture) {
                if (typeof elements.addEventListener === "function") {
                  return _delegate.apply(null, arguments);
                }
                if (typeof type === "function") {
                  return _delegate.bind(null, document).apply(null, arguments);
                }
                if (typeof elements === "string") {
                  elements = document.querySelectorAll(elements);
                }
                return Array.prototype.map.call(elements, function(element) {
                  return _delegate(element, selector, type, callback, useCapture);
                });
              }
              function listener(element, selector, type, callback) {
                return function(e) {
                  e.delegateTarget = closest(e.target, selector);
                  if (e.delegateTarget) {
                    callback.call(element, e);
                  }
                };
              }
              module2.exports = delegate;
            }
          ),
          /***/
          879: (
            /***/
            function(__unused_webpack_module, exports2) {
              exports2.node = function(value) {
                return value !== void 0 && value instanceof HTMLElement && value.nodeType === 1;
              };
              exports2.nodeList = function(value) {
                var type = Object.prototype.toString.call(value);
                return value !== void 0 && (type === "[object NodeList]" || type === "[object HTMLCollection]") && "length" in value && (value.length === 0 || exports2.node(value[0]));
              };
              exports2.string = function(value) {
                return typeof value === "string" || value instanceof String;
              };
              exports2.fn = function(value) {
                var type = Object.prototype.toString.call(value);
                return type === "[object Function]";
              };
            }
          ),
          /***/
          370: (
            /***/
            function(module2, __unused_webpack_exports, __webpack_require__2) {
              var is = __webpack_require__2(879);
              var delegate = __webpack_require__2(438);
              function listen(target, type, callback) {
                if (!target && !type && !callback) {
                  throw new Error("Missing required arguments");
                }
                if (!is.string(type)) {
                  throw new TypeError("Second argument must be a String");
                }
                if (!is.fn(callback)) {
                  throw new TypeError("Third argument must be a Function");
                }
                if (is.node(target)) {
                  return listenNode(target, type, callback);
                } else if (is.nodeList(target)) {
                  return listenNodeList(target, type, callback);
                } else if (is.string(target)) {
                  return listenSelector(target, type, callback);
                } else {
                  throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");
                }
              }
              function listenNode(node, type, callback) {
                node.addEventListener(type, callback);
                return {
                  destroy: function() {
                    node.removeEventListener(type, callback);
                  }
                };
              }
              function listenNodeList(nodeList, type, callback) {
                Array.prototype.forEach.call(nodeList, function(node) {
                  node.addEventListener(type, callback);
                });
                return {
                  destroy: function() {
                    Array.prototype.forEach.call(nodeList, function(node) {
                      node.removeEventListener(type, callback);
                    });
                  }
                };
              }
              function listenSelector(selector, type, callback) {
                return delegate(document.body, selector, type, callback);
              }
              module2.exports = listen;
            }
          ),
          /***/
          817: (
            /***/
            function(module2) {
              function select(element) {
                var selectedText;
                if (element.nodeName === "SELECT") {
                  element.focus();
                  selectedText = element.value;
                } else if (element.nodeName === "INPUT" || element.nodeName === "TEXTAREA") {
                  var isReadOnly = element.hasAttribute("readonly");
                  if (!isReadOnly) {
                    element.setAttribute("readonly", "");
                  }
                  element.select();
                  element.setSelectionRange(0, element.value.length);
                  if (!isReadOnly) {
                    element.removeAttribute("readonly");
                  }
                  selectedText = element.value;
                } else {
                  if (element.hasAttribute("contenteditable")) {
                    element.focus();
                  }
                  var selection = window.getSelection();
                  var range = document.createRange();
                  range.selectNodeContents(element);
                  selection.removeAllRanges();
                  selection.addRange(range);
                  selectedText = selection.toString();
                }
                return selectedText;
              }
              module2.exports = select;
            }
          ),
          /***/
          279: (
            /***/
            function(module2) {
              function E() {
              }
              E.prototype = {
                on: function(name, callback, ctx) {
                  var e = this.e || (this.e = {});
                  (e[name] || (e[name] = [])).push({
                    fn: callback,
                    ctx
                  });
                  return this;
                },
                once: function(name, callback, ctx) {
                  var self2 = this;
                  function listener() {
                    self2.off(name, listener);
                    callback.apply(ctx, arguments);
                  }
                  listener._ = callback;
                  return this.on(name, listener, ctx);
                },
                emit: function(name) {
                  var data = [].slice.call(arguments, 1);
                  var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
                  var i = 0;
                  var len = evtArr.length;
                  for (i; i < len; i++) {
                    evtArr[i].fn.apply(evtArr[i].ctx, data);
                  }
                  return this;
                },
                off: function(name, callback) {
                  var e = this.e || (this.e = {});
                  var evts = e[name];
                  var liveEvents = [];
                  if (evts && callback) {
                    for (var i = 0, len = evts.length; i < len; i++) {
                      if (evts[i].fn !== callback && evts[i].fn._ !== callback)
                        liveEvents.push(evts[i]);
                    }
                  }
                  liveEvents.length ? e[name] = liveEvents : delete e[name];
                  return this;
                }
              };
              module2.exports = E;
              module2.exports.TinyEmitter = E;
            }
          )
          /******/
        };
        var __webpack_module_cache__ = {};
        function __webpack_require__(moduleId) {
          if (__webpack_module_cache__[moduleId]) {
            return __webpack_module_cache__[moduleId].exports;
          }
          var module2 = __webpack_module_cache__[moduleId] = {
            /******/
            // no module.id needed
            /******/
            // no module.loaded needed
            /******/
            exports: {}
            /******/
          };
          __webpack_modules__[moduleId](module2, module2.exports, __webpack_require__);
          return module2.exports;
        }
        !function() {
          __webpack_require__.n = function(module2) {
            var getter = module2 && module2.__esModule ? (
              /******/
              function() {
                return module2["default"];
              }
            ) : (
              /******/
              function() {
                return module2;
              }
            );
            __webpack_require__.d(getter, { a: getter });
            return getter;
          };
        }();
        !function() {
          __webpack_require__.d = function(exports2, definition) {
            for (var key in definition) {
              if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports2, key)) {
                Object.defineProperty(exports2, key, { enumerable: true, get: definition[key] });
              }
            }
          };
        }();
        !function() {
          __webpack_require__.o = function(obj, prop) {
            return Object.prototype.hasOwnProperty.call(obj, prop);
          };
        }();
        return __webpack_require__(686);
      }().default
    );
  });
})(clipboard);
const u = typeof window < "u";
const v = (e, t = false) => {
  const r = e.replace(/-(\w)/g, (n, o) => o.toUpperCase());
  return t ? `${r[0].toUpperCase()}${r.substring(1)}` : r;
}, I = (e) => e.replace(/[A-Z]/g, (t) => "-" + t.toLowerCase());
const b = () => {
  if (!u)
    return {};
  const e = navigator.userAgent, t = /macintosh|mac os x/i.test(e), r = /micromessenger/.test(e.toLowerCase());
  return {
    devicePixelRatio: window.devicePixelRatio,
    language: navigator.language,
    windowHeight: window.innerHeight,
    windowWidth: window.innerWidth,
    statusBarHeight: 0,
    navBarHeight: 0,
    isMac: t,
    isIos: /(iPhone|iPad|iPod|iOS)/i.test(e) || t,
    isWeixin: r,
    isAlipay: /alipay/.test(e.toLowerCase()),
    isMpWebWeixin: r && e.includes("miniProgram")
  };
}, d = (e, t = 2, r) => {
  const n = Number(e);
  if (isNaN(n))
    return 0;
  const { floor: o } = r || {}, i = Math.pow(10, t + 1), a = Math.pow(10, t);
  return (o ? Math.floor(n * i / 10) : Math.round(n * i / 10)) / a;
}, g = (e, t = 2, r) => {
  const { right: n, sign: o = "0" } = r || {}, i = String(e);
  let a = "";
  const c = t - i.length;
  if (c > 0)
    for (let s = 0; s < c; s++)
      a += o;
  return n ? `${i}${a}` : `${a}${i}`;
};
const camelize = v;
const kebabCase = I;
const roundNumber = d;
const padNumber = g;
function createNamespace(name) {
  const prefixedName = `fan-${name}`;
  return [camelize(prefixedName, true)];
}
function createUniqueId(opt) {
  return "" + ((opt == null ? void 0 : opt.prefix) || "") + Math.floor(Math.random() * 1e6).toString(36);
}
function resolveAspectRatio(ar) {
  if (typeof ar === "string") {
    if (ar.includes("/") || ar.includes(":")) {
      const [a, b2] = ar.replace("/", ":").split(":");
      return Number(a) / Number(b2);
    }
    return Number(ar);
  }
  return ar;
}
const parseTimeData = (time, hasDays = true) => {
  const SECOND = 1e3;
  const MINUTE = 60 * SECOND;
  const HOUR = 60 * MINUTE;
  const DAY = 24 * HOUR;
  time = time || 0;
  let days = "00";
  let hours = "00";
  if (hasDays) {
    days = padNumber(Math.floor(time / DAY));
    hours = padNumber(Math.floor(time % DAY / HOUR));
  } else {
    hours = padNumber(Math.floor(time / HOUR));
  }
  const minutes = padNumber(Math.floor(time % HOUR / MINUTE));
  const seconds = padNumber(Math.floor(time % MINUTE / SECOND));
  const milliseconds = Math.floor(Math.floor(time % SECOND) / 100);
  return {
    days,
    hours,
    minutes,
    seconds,
    milliseconds
  };
};
var __defProp$2 = Object.defineProperty;
var __defProps$2 = Object.defineProperties;
var __getOwnPropDescs$2 = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols$2 = Object.getOwnPropertySymbols;
var __hasOwnProp$2 = Object.prototype.hasOwnProperty;
var __propIsEnum$2 = Object.prototype.propertyIsEnumerable;
var __defNormalProp$2 = (obj, key, value) => key in obj ? __defProp$2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues$2 = (a, b2) => {
  for (var prop in b2 || (b2 = {}))
    if (__hasOwnProp$2.call(b2, prop))
      __defNormalProp$2(a, prop, b2[prop]);
  if (__getOwnPropSymbols$2)
    for (var prop of __getOwnPropSymbols$2(b2)) {
      if (__propIsEnum$2.call(b2, prop))
        __defNormalProp$2(a, prop, b2[prop]);
    }
  return a;
};
var __spreadProps$2 = (a, b2) => __defProps$2(a, __getOwnPropDescs$2(b2));
const getSystemInfo = () => __spreadProps$2(__spreadValues$2({}, b()), {
  statusBarHeight: 0,
  navBarHeight: 44
});
const getInputValue = (event) => {
  return event.target.value;
};
const saveImage = (url) => {
  console.error("H5环境暂不支持");
};
const ListStatus = {
  hasMore: "hasMore",
  loading: "loading",
  noMore: "noMore",
  error: "error"
};
const FanConfig = {
  runEnv: "h5",
  mpPlugin: false,
  uniapp: false
};
const Config = FanConfig;
var stdin_default$L = FanConfig;
function isCssRelativeSize(value) {
  const reg = /(em|%|vw|vh|calc|rem|rpx)/;
  return reg.test(String(value));
}
function getCssSizeValue(value) {
  if (typeof value === "string") {
    return parseFloat(value.replace(/[^-0-9.]/g, ""));
  }
  return value;
}
function transformSize(size) {
  if (!size)
    return size;
  const sizeStr = String(size);
  if (isCssRelativeSize(sizeStr) || sizeStr.includes("PX") || sizeStr.includes("Px")) {
    return sizeStr;
  }
  const val = getCssSizeValue(sizeStr);
  if (!val) {
    return sizeStr;
  }
  if (stdin_default$L.rem && val >= stdin_default$L.rem.minPixelValue) {
    const valStr = String(val / stdin_default$L.rem.rootValue);
    const [valInt, decimals] = valStr.split(".");
    if (decimals && decimals.length > stdin_default$L.rem.unitPrecision) {
      const d2 = decimals.substring(0, stdin_default$L.rem.unitPrecision).replace(/0*$/, "");
      return `${valInt}${!d2 ? "" : "." + d2}rem`;
    }
    return valStr + "rem";
  }
  if (stdin_default$L.rpx) {
    return val * 2 + "rpx";
  }
  return val + "px";
}
function transformStyleSize(style) {
  if (!style)
    return "";
  let styleObj = {};
  let hasColon = false;
  if (typeof style === "string") {
    if (style.includes("://")) {
      hasColon = true;
      style = style.replace("://", "{{colon//}}");
    }
    const couples = style.split(";");
    couples.forEach((a) => {
      if (!a.trim())
        return;
      const [k, v2] = a.split(":");
      styleObj[k.trim()] = v2.trim();
    });
  } else if (typeof style === "object") {
    styleObj = style;
  } else {
    return "";
  }
  let styleStr = "";
  for (let k in styleObj) {
    let v2 = styleObj[k];
    if (typeof v2 === "string") {
      if (v2.includes("px"))
        v2 = v2.replace(/[-0-9.]+px/g, (a) => transformSize(a));
      if (hasColon)
        v2 = v2.replace("{{colon//}}", "://");
    }
    styleStr += `${kebabCase(k)}:${v2};`;
  }
  return styleStr;
}
function getElementNodes(selector, opt) {
  var _a;
  const { selectAll = false, scope } = opt || {};
  const _scope = ((_a = scope == null ? void 0 : scope.vnode) == null ? void 0 : _a.el) || document;
  if (!selectAll) {
    let el = _scope.querySelector(selector);
    if (!el) {
      if (selector.startsWith(".") && _scope.classList.contains(selector.substring(1)) || selector.startsWith("#") && _scope.id === selector.substring(1))
        el = _scope;
    }
    return el;
  }
  return _scope.querySelectorAll(selector);
}
function getElementBounding(opt) {
  return new Promise((resolve) => {
    const { el, selector, selectAll = false, scope } = opt || {};
    if (el) {
      resolve(el.getBoundingClientRect());
      return;
    }
    if (!selector) {
      resolve(null);
      return;
    }
    if (!selectAll) {
      const node = getElementNodes(selector, { scope });
      resolve(node == null ? void 0 : node.getBoundingClientRect());
      return;
    }
    const nodes = getElementNodes(selector, {
      scope,
      selectAll
    });
    const arr = [];
    nodes.forEach((e) => {
      arr.push(e.getBoundingClientRect());
    });
    resolve(arr);
  });
}
const extend$1 = Object.assign;
function usePopupState() {
  const state = reactive({
    show: false
  });
  const toggle = (show) => {
    state.show = show;
  };
  const open = (props) => {
    extend$1(state, props);
    toggle(true);
  };
  const close = () => toggle(false);
  const instance2 = getCurrentInstance();
  if (instance2) {
    extend$1(instance2.proxy, { open, close, toggle });
  }
  return {
    open,
    close,
    state,
    toggle
  };
}
function mountComponent(RootComponent) {
  const inBrowser = typeof window !== "undefined";
  if (!inBrowser)
    return { instance: null, unmount() {
    } };
  const app = createApp(RootComponent);
  const root = document.createElement("div");
  root.style.position = "relative";
  root.style.zIndex = "99999";
  document.body.appendChild(root);
  return {
    instance: app.mount(root),
    unmount() {
      app.unmount();
      document.body.removeChild(root);
    }
  };
}
const toastSfc = "";
const iconSfc = "";
const __vue_sfc__$J = defineComponent({
  name: createNamespace("Icon")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["click"],
  props: {
    customStyle: [String, Object],
    /**
     * 图标名称或图片链接
     */
    name: String,
    size: {
      type: [String, Number],
      default: "inherit"
    },
    // css 属性
    verticalAlign: String,
    /**
     * 图标颜色：red，支持渐变：linear-gradient(to right, red, blue)
     */
    color: {
      type: String,
      default: "inherit"
    }
  },
  setup(props, context) {
    const imgIcon = computed(() => {
      var _a;
      return (_a = props.name) == null ? void 0 : _a.includes("/");
    });
    const theStyle = computed(() => {
      let { name, color, size, verticalAlign, customStyle } = props;
      const fsize = transformSize(size === "inherit" ? "14px" : size);
      let str = "";
      if (verticalAlign) {
        str += `--fan-icon-align-v:${verticalAlign};`;
      }
      if (imgIcon.value) {
        name = name.replace(/\"/g, "'");
        str += `width:${fsize};height:${fsize};`;
        if (color && color !== "inherit") {
          str += `-webkit-mask-image:url("${name}");mask-image:url("${name}");-webkit-mask-size:cover;mask-size:cover;background:${color}`;
        } else {
          str += `background:url("${name}") center / cover no-repeat;`;
        }
      } else {
        str += `font-size:${fsize};`;
        if (color == null ? void 0 : color.includes("-gradient")) {
          str += `color:transparent;background-image:${color};`;
        } else {
          str += `color:${color};`;
        }
      }
      return transformStyleSize(customStyle) + str;
    });
    const onClick = (e) => {
      context.emit("click", e);
    };
    return { imgIcon, theStyle, onClick };
  }
});
function __vue_render__$J(_ctx, _cache) {
  return _ctx.imgIcon ? (openBlock(), createElementBlock(
    "div",
    {
      key: 0,
      style: normalizeStyle(_ctx.theStyle),
      class: "fan-icon--img",
      onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))
    },
    null,
    4
    /* STYLE */
  )) : (openBlock(), createElementBlock(
    "div",
    {
      key: 1,
      style: normalizeStyle(_ctx.theStyle),
      class: normalizeClass(["fan-icon", "icon-" + _ctx.name]),
      onClick: _cache[1] || (_cache[1] = (...args) => _ctx.onClick && _ctx.onClick(...args))
    },
    null,
    6
    /* CLASS, STYLE */
  ));
}
__vue_sfc__$J.render = __vue_render__$J;
var stdin_default$K = __vue_sfc__$J;
const loadingSfc = "";
const __vue_sfc__$I = defineComponent({
  name: createNamespace("Loading")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["click"],
  props: {
    inline: {
      type: Boolean,
      default: false
    },
    color: {
      type: String,
      default: "#c9c9c9"
    },
    type: {
      type: String,
      validator: (value) => ["circle", "circle2", "spinner", "line"].includes(value),
      // default: () => (getSystemInfo().isIos ? 'spinner' : 'circle2')
      default: "circle2"
    },
    size: {
      type: [String, Number],
      default: "30px"
    },
    textSize: {
      type: [String, Number],
      default: "14px"
    },
    /**
     * @default 跟随props.color
     */
    textColor: String,
    /**
     * 是否垂直排列图标和文字内容
     */
    vertical: Boolean
  },
  setup(props) {
    const array12 = Array.from({ length: 12 });
    const array3 = Array.from({ length: 3 });
    const theStyle = computed(() => {
      const { color, textSize, textColor } = props;
      return transformStyleSize({ color: textColor || color, fontSize: textSize });
    });
    const iconStyle = computed(() => {
      const { size, color } = props;
      const s = transformSize(size);
      let str = `width:${s};height:${s};color:${color};`;
      return str;
    });
    return { array12, array3, theStyle, iconStyle };
  }
});
const _hoisted_1$v = { class: "fan-loading__t" };
function __vue_render__$I(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: normalizeClass(["fan-loading", { "fan-loading--inline": _ctx.inline, "fan-loading--vertical": _ctx.vertical }]),
      style: normalizeStyle(_ctx.theStyle),
      onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click", $event))
    },
    [
      createElementVNode(
        "div",
        {
          class: normalizeClass(["fan-loading__i", "fan-loading__i--" + _ctx.type]),
          style: normalizeStyle(_ctx.iconStyle)
        },
        [
          _ctx.type === "spinner" ? (openBlock(true), createElementBlock(
            Fragment,
            { key: 0 },
            renderList(_ctx.array12, (_, index) => {
              return openBlock(), createElementBlock("div", {
                key: index,
                class: "fan-loading__dot"
              });
            }),
            128
            /* KEYED_FRAGMENT */
          )) : createCommentVNode("v-if", true),
          _ctx.type === "line" ? (openBlock(true), createElementBlock(
            Fragment,
            { key: 1 },
            renderList(_ctx.array3, (_, index) => {
              return openBlock(), createElementBlock("div", {
                key: index,
                class: "fan-loading__ldot"
              });
            }),
            128
            /* KEYED_FRAGMENT */
          )) : createCommentVNode("v-if", true)
        ],
        6
        /* CLASS, STYLE */
      ),
      createElementVNode("div", _hoisted_1$v, [
        renderSlot(_ctx.$slots, "default")
      ])
    ],
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$I.render = __vue_render__$I;
var stdin_default$J = __vue_sfc__$I;
const __vue_sfc__$H = defineComponent({
  name: createNamespace("Toast")[0],
  components: { FanIcon: stdin_default$K, FanLoading: stdin_default$J },
  emits: ["update:show"],
  props: {
    show: {
      type: Boolean,
      default: false
    },
    message: String,
    icon: {
      type: String,
      default: "none",
      validator: (val) => ["none", "success", "error", "loading"].includes(val)
    },
    duration: {
      type: Number,
      default: 2e3
    },
    delay: {
      type: Number,
      default: 0
    },
    mask: {
      type: Boolean,
      default: true
    }
  },
  setup(props, { emit }) {
    const innerShow = ref(props.show);
    const showIconType = computed(() => {
      const { icon } = props;
      if (icon === "none") {
        return "none";
      } else if (icon === "loading") {
        return "loading";
      } else {
        return "icon";
      }
    });
    let timer;
    watch(
      () => props.show,
      (val) => {
        if (timer)
          clearTimeout(timer);
        if (val && props.delay) {
          timer = setTimeout(() => {
            innerShow.value = val;
          }, props.delay);
        } else {
          innerShow.value = val;
        }
      }
    );
    watch(innerShow, (val) => {
      emit("update:show", val);
      if (val && props.duration > 0)
        setTimeout(() => innerShow.value = false, props.duration);
    });
    return { showIconType, innerShow };
  }
});
const _hoisted_1$u = { key: 0 };
const _hoisted_2$k = {
  key: 0,
  class: "fan-toast__mask"
};
const _hoisted_3$7 = { class: "fan-toast__text" };
function __vue_render__$H(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  const _component_FanLoading = resolveComponent("FanLoading");
  return openBlock(), createBlock(Transition, { name: "fan" }, {
    default: withCtx(() => [
      _ctx.innerShow ? (openBlock(), createElementBlock("div", _hoisted_1$u, [
        _ctx.mask && _ctx.showIconType === "loading" ? (openBlock(), createElementBlock("div", _hoisted_2$k)) : createCommentVNode("v-if", true),
        createElementVNode(
          "div",
          {
            class: normalizeClass(["fan-toast fan-flex-center fan-flex-col", _ctx.icon === "none" ? "fan-toast--text" : "fan-toast--icon"])
          },
          [
            _ctx.showIconType === "icon" ? (openBlock(), createBlock(_component_FanIcon, {
              key: 0,
              name: _ctx.icon === "success" ? "check" : "exclamation",
              size: "36",
              color: "#fff"
            }, null, 8, ["name"])) : _ctx.showIconType === "loading" ? (openBlock(), createBlock(_component_FanLoading, {
              key: 1,
              color: "#fff",
              size: "36"
            })) : createCommentVNode("v-if", true),
            createElementVNode(
              "div",
              _hoisted_3$7,
              toDisplayString(_ctx.message),
              1
              /* TEXT */
            )
          ],
          2
          /* CLASS */
        )
      ])) : createCommentVNode("v-if", true)
    ]),
    _: 1
    /* STABLE */
  });
}
__vue_sfc__$H.render = __vue_render__$H;
var stdin_default$I = __vue_sfc__$H;
const dialogSfc = "";
const buttonSfc = "";
const __vue_sfc__$G = defineComponent({
  name: createNamespace("Button")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanLoading: stdin_default$J, FanIcon: stdin_default$K },
  emits: ["click", "getphonenumber"],
  props: {
    color: String,
    bg: String,
    width: String,
    height: String,
    margin: String,
    padding: String,
    flex1: {
      type: Boolean,
      default: false
    },
    textSize: {
      type: [String, Number]
    },
    textColor: String,
    bold: [Boolean, Number, String],
    /**
     * 图标或图片链接，同 Icon 组件的 name属性
     */
    icon: String,
    /**
     * 图标/loading的大小
     * @default textSize
     */
    iconSize: [String, Number],
    iconPosition: {
      type: String,
      validator: (value) => ["left", "right"].includes(value),
      default: "left"
    },
    // 图标与文字的间距
    iconPad: [String, Number],
    /**
     * 是否为块级元素
     */
    block: {
      type: Boolean,
      default: false
    },
    /**
     * 是否为朴素按钮
     */
    plain: {
      type: Boolean,
      default: false
    },
    /**
     * 是否有边框，plain朴素按钮时生效
     */
    border: {
      type: Boolean,
      default: true
    },
    round: {
      type: Boolean,
      default: false
    },
    /**
     * 圆角
     */
    radius: [String, Number],
    disabled: {
      type: Boolean,
      default: false
    },
    /**
     * 是否使用 0.5px 边框
     */
    hairline: {
      type: Boolean,
      default: false
    },
    loading: {
      type: Boolean,
      default: false
    },
    loadingText: String,
    // 同 Loading 组件的 type属性
    loadingType: {
      type: String,
      default: "circle2"
    },
    // 开放能力，目前仅非H5有效，同 https://uniapp.dcloud.io/component/button.html
    openType: String
  },
  setup(props, context) {
    const theStyle = computed(() => {
      const {
        color,
        bg: _bg,
        plain,
        textSize,
        textColor,
        bold,
        round,
        radius,
        iconPad
      } = props;
      const obj = {};
      ["width", "height", "padding", "margin"].forEach(
        (k) => props[k] && (obj[k] = props[k])
      );
      const bg = _bg || (plain ? "transparent" : color);
      if (bg)
        obj["--fan-btn-bg"] = bg;
      const c = textColor || (plain ? color || "var(--fan-primary-color)" : !color ? "" : "white");
      if (c)
        obj["--fan-btn-text-color"] = c;
      if (textSize)
        obj.fontSize = transformSize(textSize);
      if (iconPad)
        obj["--fan-btn-icon-pad"] = transformSize(iconPad);
      if ((typeof bold === "number" || typeof bold === "string") && Number(bold) >= 100) {
        obj.fontWeight = bold;
      }
      if (plain && color)
        obj["--fan-btn-border-color"] = color;
      if (radius || radius === 0)
        obj["--fan-btn-border-radius"] = radius;
      else if (round)
        obj["--fan-btn-border-radius"] = "var(--fan-radius-max)";
      return transformStyleSize(obj);
    });
    const theIconSize = computed(() => {
      return props.iconSize || props.textSize;
    });
    const theIconPosition = computed(() => {
      const { icon, iconPosition, loading } = props;
      if (loading)
        return "left";
      if (!icon)
        return "none";
      return iconPosition;
    });
    const showText = computed(() => {
      const { loading, loadingText } = props;
      return context.slots.default && (!loading || !loadingText);
    });
    const onClick = (e) => {
      context.emit("click", e);
    };
    const getPhoneNumber = (e) => {
      context.emit("getphonenumber", e);
    };
    return {
      theStyle,
      theIconSize,
      theIconPosition,
      showText,
      onClick,
      getPhoneNumber
    };
  }
});
const _hoisted_1$t = ["disabled", "open-type"];
const _hoisted_2$j = {
  key: 0,
  class: "fan-btn__hairline"
};
function __vue_render__$G(_ctx, _cache) {
  const _component_FanLoading = resolveComponent("FanLoading");
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock("button", {
    class: normalizeClass(["fan-btn", {
      "fan-btn--f1": _ctx.flex1,
      "fan-btn--block": _ctx.block,
      "fan-btn--disabled": _ctx.disabled,
      "fan-btn--noborder": !_ctx.border,
      "fan-btn--hairline": _ctx.hairline,
      "fan-btn--plain": _ctx.plain,
      "fan-btn--bold": _ctx.bold
    }]),
    "hover-class": "none",
    style: normalizeStyle(_ctx.theStyle),
    disabled: _ctx.disabled,
    "open-type": _ctx.openType,
    onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args)),
    onGetphonenumber: _cache[1] || (_cache[1] = (...args) => _ctx.getPhoneNumber && _ctx.getPhoneNumber(...args))
  }, [
    createCommentVNode(" fix：uniapp-App-伪元素超不出100% "),
    _ctx.hairline ? (openBlock(), createElementBlock("div", _hoisted_2$j)) : createCommentVNode("v-if", true),
    _ctx.loading ? (openBlock(), createBlock(_component_FanLoading, {
      key: 1,
      color: "currentColor",
      type: _ctx.loadingType,
      size: _ctx.theIconSize,
      "text-size": _ctx.textSize,
      "text-color": "inherit"
    }, {
      default: withCtx(() => [
        createTextVNode(
          toDisplayString(_ctx.loadingText),
          1
          /* TEXT */
        )
      ]),
      _: 1
      /* STABLE */
    }, 8, ["type", "size", "text-size"])) : createCommentVNode("v-if", true),
    _ctx.theIconPosition === "left" ? (openBlock(), createBlock(_component_FanIcon, {
      key: 2,
      name: _ctx.icon,
      color: "currentColor",
      size: _ctx.theIconSize
    }, null, 8, ["name", "size"])) : createCommentVNode("v-if", true),
    _ctx.showText ? (openBlock(), createElementBlock(
      "div",
      {
        key: 3,
        class: normalizeClass(["fan-btn__in", [`fan-btn--i${_ctx.theIconPosition}`]])
      },
      [
        renderSlot(_ctx.$slots, "default")
      ],
      2
      /* CLASS */
    )) : createCommentVNode("v-if", true),
    _ctx.theIconPosition === "right" ? (openBlock(), createBlock(_component_FanIcon, {
      key: 4,
      name: _ctx.icon,
      color: "currentColor",
      size: _ctx.theIconSize
    }, null, 8, ["name", "size"])) : createCommentVNode("v-if", true)
  ], 46, _hoisted_1$t);
}
__vue_sfc__$G.render = __vue_render__$G;
var stdin_default$H = __vue_sfc__$G;
const __vue_sfc__$F = defineComponent({
  name: createNamespace("Dialog")[0],
  components: { FanButton: stdin_default$H },
  emits: ["update:show", "confirm", "cancel"],
  props: {
    show: {
      type: Boolean,
      default: false
    },
    title: String,
    message: String,
    cancelText: {
      type: String,
      default: "取消"
    },
    cancelColor: {
      type: String,
      default: "#84878F"
    },
    showCancel: {
      type: Boolean,
      default: false
    },
    confirmText: {
      type: String,
      default: "确定"
    },
    confirmColor: {
      type: String,
      default: "#F7931E"
    },
    callback: {
      type: Function,
      default: () => {
      }
    }
  },
  setup(props, { emit }) {
    const innerShow = ref(props.show);
    watch(
      () => props.show,
      (val) => {
        if (props.message || props.title)
          innerShow.value = val;
      }
    );
    watch(innerShow, (val) => emit("update:show", val));
    const getActionHandler = (action) => {
      var _a;
      emit(action);
      innerShow.value = false;
      (_a = props.callback) == null ? void 0 : _a.call(props, action);
    };
    const onCancel = () => getActionHandler("cancel");
    const onConfirm = () => getActionHandler("confirm");
    return { innerShow, onCancel, onConfirm };
  }
});
const _hoisted_1$s = {
  key: 0,
  class: "fan-dialog__o"
};
const _hoisted_2$i = { class: "fan-dialog" };
const _hoisted_3$6 = { class: "fan-dialog__inner" };
const _hoisted_4$4 = {
  key: 0,
  class: "fan-dialog__t"
};
const _hoisted_5$2 = { class: "fan-flex fan-hairline--top" };
function __vue_render__$F(_ctx, _cache) {
  return openBlock(), createBlock(Transition, { name: "fan" }, {
    default: withCtx(() => [
      _ctx.innerShow ? (openBlock(), createElementBlock("div", _hoisted_1$s, [
        createElementVNode("div", _hoisted_2$i, [
          createElementVNode("div", _hoisted_3$6, [
            _ctx.title ? (openBlock(), createElementBlock(
              "div",
              _hoisted_4$4,
              toDisplayString(_ctx.title),
              1
              /* TEXT */
            )) : createCommentVNode("v-if", true),
            createElementVNode(
              "div",
              {
                class: normalizeClass(["fan-dialog__c", { "fan-dialog__his_title": !_ctx.title }])
              },
              toDisplayString(_ctx.message),
              3
              /* TEXT, CLASS */
            )
          ]),
          createElementVNode("div", _hoisted_5$2, [
            _ctx.showCancel ? (openBlock(), createElementBlock(
              "div",
              {
                key: 0,
                class: "fan-dialog__btn fan-flex-center fan-hairline--right fan-dialog__cancel",
                style: normalizeStyle({ "--dialog-cancel": _ctx.cancelColor }),
                onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onCancel && _ctx.onCancel(...args))
              },
              toDisplayString(_ctx.cancelText),
              5
              /* TEXT, STYLE */
            )) : createCommentVNode("v-if", true),
            createElementVNode(
              "div",
              {
                class: "fan-dialog__btn fan-flex-center",
                style: normalizeStyle({ "--dialog-confirm": _ctx.confirmColor }),
                onClick: _cache[1] || (_cache[1] = (...args) => _ctx.onConfirm && _ctx.onConfirm(...args))
              },
              toDisplayString(_ctx.confirmText),
              5
              /* TEXT, STYLE */
            )
          ])
        ])
      ])) : createCommentVNode("v-if", true)
    ]),
    _: 1
    /* STABLE */
  });
}
__vue_sfc__$F.render = __vue_render__$F;
var stdin_default$G = __vue_sfc__$F;
var __defProp$1 = Object.defineProperty;
var __defProps$1 = Object.defineProperties;
var __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;
var __hasOwnProp$1 = Object.prototype.hasOwnProperty;
var __propIsEnum$1 = Object.prototype.propertyIsEnumerable;
var __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues$1 = (a, b2) => {
  for (var prop in b2 || (b2 = {}))
    if (__hasOwnProp$1.call(b2, prop))
      __defNormalProp$1(a, prop, b2[prop]);
  if (__getOwnPropSymbols$1)
    for (var prop of __getOwnPropSymbols$1(b2)) {
      if (__propIsEnum$1.call(b2, prop))
        __defNormalProp$1(a, prop, b2[prop]);
    }
  return a;
};
var __spreadProps$1 = (a, b2) => __defProps$1(a, __getOwnPropDescs$1(b2));
const defaultOptions = {
  title: "",
  message: "",
  cancelText: "取消",
  cancelColor: "#84878F",
  showCancel: false,
  confirmText: "确定",
  confirmColor: "#F7931E",
  callback: null
};
let instance;
function parseOptions(message) {
  if (typeof message === "object")
    return message;
  return {
    message: message ? String(message) : ""
  };
}
const createInstance = () => {
  const Wrapper = {
    setup() {
      const {
        state,
        toggle
      } = usePopupState();
      return () => createVNode(stdin_default$G, mergeProps(state, {
        "onUpdate:show": toggle
      }), null);
    }
  };
  ({
    instance
  } = mountComponent(Wrapper));
};
const dialog = (options) => {
  return new Promise((resolve, reject) => {
    if (!instance) {
      createInstance();
    }
    const parsedOptions = parseOptions(options);
    instance.open(__spreadProps$1(__spreadValues$1(__spreadValues$1({}, defaultOptions), parsedOptions), {
      callback: (action) => {
        console.log(action);
        (action === "confirm" ? resolve : reject)(action);
      }
    }));
  });
};
dialog.confirm = (options) => {
  const parsedOptions = parseOptions(options);
  return dialog(__spreadProps$1(__spreadValues$1({}, parsedOptions), {
    showCancel: true
  }));
};
const __vue_sfc__$E = defineComponent({
  name: createNamespace("AspectRatio")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    /**
     * 盒子宽高比
     * 支持：比值number、a/b、a:b
     * 宽度未知时主要是利用padding的百分比值是相对于包含块（一般是父盒子）的宽度，造出指定比例的容器
     */
    aspectRatio: [Number, String],
    width: [Number, String],
    height: [Number, String]
  },
  emits: ["click"],
  setup(props, context) {
    const resolveAspectRatio2 = (ar) => {
      if (typeof ar === "string") {
        if (ar.includes("/") || ar.includes(":")) {
          const [a, b2] = ar.replace("/", ":").split(":");
          return a / b2;
        }
        return Number(ar);
      }
      return ar;
    };
    const state = computed(() => {
      let wrapper = false;
      let wrapperStyle = "overflow:hidden;";
      let style = "";
      const { aspectRatio, width, height } = props;
      const ar = resolveAspectRatio2(aspectRatio);
      const w = getCssSizeValue(width);
      const wUnit = transformSize(width);
      const h2 = getCssSizeValue(height);
      const hUnit = transformSize(height);
      if (height) {
        if (width) {
          style += `width:${wUnit};height:${hUnit};`;
        } else if (ar && !isCssRelativeSize(height)) {
          style += `width:${transformSize(h2 * ar)};height:${hUnit};`;
        } else {
          style += `height:${hUnit};`;
        }
      } else if (ar) {
        if (!width || isCssRelativeSize(width)) {
          wrapper = true;
          style = `position:relative;height:0;`;
          if (width) {
            const unit = wUnit.replace(/[0-9.]/g, "");
            style += `width:${width};padding-bottom:${roundNumber(w / ar, 5)}${unit};`;
          } else {
            style += `width:100%;padding-bottom:${roundNumber(100 / ar, 5)}%;`;
          }
        } else {
          style += `width:${wUnit};height:${transformSize(w / ar)};`;
        }
      } else if (width) {
        style += `width:${wUnit};`;
      }
      if (wUnit)
        wrapperStyle += `width:${wUnit};`;
      if (hUnit)
        wrapperStyle += `height:${hUnit};`;
      return {
        style,
        wrapper,
        wrapperStyle,
        rootStyle: wrapperStyle + style
      };
    });
    const onClick = (e) => context.emit("click", e);
    return { state, onClick };
  }
});
function __vue_render__$E(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: "fan-aspect-ratio",
      style: normalizeStyle(_ctx.state.wrapperStyle)
    },
    [
      _ctx.state.wrapper ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          style: normalizeStyle(_ctx.state.style)
        },
        [
          createElementVNode("div", {
            class: "fan-aspect-ratio__box",
            onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))
          }, [
            renderSlot(_ctx.$slots, "default")
          ])
        ],
        4
        /* STYLE */
      )) : (openBlock(), createElementBlock("div", {
        key: 1,
        style: { "width": "100%", "height": "100%" },
        onClick: _cache[1] || (_cache[1] = (...args) => _ctx.onClick && _ctx.onClick(...args))
      }, [
        renderSlot(_ctx.$slots, "default")
      ]))
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$E.render = __vue_render__$E;
var stdin_default$F = __vue_sfc__$E;
const AspectRatio = stdin_default$F;
const Button = stdin_default$H;
const cellSfc = "";
const __vue_sfc__$D = defineComponent({
  name: createNamespace("Cell")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K },
  emits: ["click"],
  props: {
    title: {
      type: [String, Number],
      default: ""
    },
    titleStyle: [String, Object],
    value: {
      type: [String, Number],
      default: ""
    },
    valueStyle: [String, Object],
    desc: {
      type: [String, Number],
      default: ""
    },
    descStyle: [String, Object],
    center: {
      type: Boolean,
      default: false
    },
    width: String,
    height: String,
    margin: String,
    padding: String,
    radius: String,
    color: String,
    titleColor: String,
    valueColor: String,
    descColor: String,
    bg: String,
    prefixIcon: String,
    suffixIcon: String,
    prefixIconCenter: {
      type: Boolean,
      default: false
    },
    suffixIconCenter: {
      type: Boolean,
      default: false
    },
    prefixIconColor: {
      type: String,
      default: "inherit"
    },
    suffixIconColor: {
      type: String,
      default: "inherit"
    },
    iconSize: [String, Number],
    prefixIconSize: [String, Number],
    suffixIconSize: [String, Number],
    prefixIconMargin: String
  },
  setup(props, context) {
    const theStyle = computed(() => {
      const { color, bg, radius } = props;
      const obj = {};
      ["width", "height", "padding", "margin"].forEach((k) => props[k] && (obj[k] = props[k]));
      if (bg)
        obj["--fan-cell-bg"] = bg;
      const c = color ? color : "";
      if (c)
        obj["--fan-cell-text-color"] = c;
      if (radius || radius === 0)
        obj["--fan-cell-border-radius"] = radius;
      return transformStyleSize(obj);
    });
    const theTitleStyle = computed(() => {
      const { titleStyle, titleColor } = props;
      const obj = {};
      if (titleColor)
        obj["--fan-cell-title-color"] = titleColor;
      return transformStyleSize(titleStyle) + transformStyleSize(obj);
    });
    const theValueStyle = computed(() => {
      const { valueStyle, valueColor } = props;
      const obj = {};
      if (valueColor)
        obj["--fan-cell-value-color"] = valueColor;
      return transformStyleSize(valueStyle) + transformStyleSize(obj);
    });
    const theDescStyle = computed(() => {
      const { descStyle, descColor } = props;
      const obj = {};
      if (descColor)
        obj["--fan-cell-desc-color"] = descColor;
      return transformStyleSize(descStyle) + transformStyleSize(obj);
    });
    const onClick = (e) => {
      context.emit("click", e);
    };
    return { theStyle, theTitleStyle, theValueStyle, theDescStyle, onClick };
  }
});
function __vue_render__$D(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      class: normalizeClass(["fan-cell", {
        "fan-cell--center": _ctx.center
      }]),
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      createElementVNode(
        "div",
        {
          class: normalizeClass({
            "fan-cell-icon--center": _ctx.prefixIconCenter
          })
        },
        [
          _ctx.prefixIconCenter ? (openBlock(), createBlock(_component_FanIcon, {
            key: 0,
            name: _ctx.prefixIcon,
            color: _ctx.prefixIconColor,
            size: _ctx.prefixIconSize || _ctx.iconSize,
            style: normalizeStyle({ margin: _ctx.prefixIconMargin }),
            class: "fan-cell-title-icon"
          }, null, 8, ["name", "color", "size", "style"])) : createCommentVNode("v-if", true),
          createElementVNode("div", null, [
            createElementVNode(
              "div",
              {
                class: "fan-cell-title",
                style: normalizeStyle(_ctx.theTitleStyle)
              },
              [
                renderSlot(_ctx.$slots, "title", {}, () => [
                  renderSlot(_ctx.$slots, "prefix-icon", {}, () => [
                    _ctx.prefixIcon && !_ctx.prefixIconCenter ? (openBlock(), createBlock(_component_FanIcon, {
                      key: 0,
                      name: _ctx.prefixIcon,
                      color: _ctx.prefixIconColor,
                      size: _ctx.prefixIconSize || _ctx.iconSize,
                      style: normalizeStyle({ margin: _ctx.prefixIconMargin }),
                      class: "fan-cell-title-icon"
                    }, null, 8, ["name", "color", "size", "style"])) : createCommentVNode("v-if", true)
                  ]),
                  createElementVNode(
                    "span",
                    null,
                    toDisplayString(_ctx.title),
                    1
                    /* TEXT */
                  )
                ])
              ],
              4
              /* STYLE */
            ),
            createElementVNode(
              "div",
              {
                class: "fan-cell-title-desc",
                style: normalizeStyle(_ctx.theDescStyle)
              },
              [
                renderSlot(_ctx.$slots, "desc", {}, () => [
                  createTextVNode(
                    toDisplayString(_ctx.desc),
                    1
                    /* TEXT */
                  )
                ])
              ],
              4
              /* STYLE */
            )
          ])
        ],
        2
        /* CLASS */
      ),
      createElementVNode(
        "div",
        {
          class: "fan-cell-content",
          onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args)),
          style: normalizeStyle(_ctx.theValueStyle)
        },
        [
          renderSlot(_ctx.$slots, "value", {}, () => [
            createElementVNode(
              "span",
              null,
              toDisplayString(_ctx.value),
              1
              /* TEXT */
            ),
            renderSlot(_ctx.$slots, "suffix-icon", {}, () => [
              createVNode(_component_FanIcon, {
                name: _ctx.suffixIcon,
                color: _ctx.suffixIconColor,
                size: _ctx.suffixIconSize || _ctx.iconSize,
                class: "fan-cell-content-icon"
              }, null, 8, ["name", "color", "size"])
            ])
          ])
        ],
        4
        /* STYLE */
      )
    ],
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$D.render = __vue_render__$D;
var stdin_default$E = __vue_sfc__$D;
const Cell = stdin_default$E;
const checkboxSfc = "";
const __vue_sfc__$C = defineComponent({
  name: createNamespace("Checkbox")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K },
  props: {
    modelValue: {
      type: Boolean,
      default: false
    },
    size: {
      type: [String, Number],
      default: "24px"
    },
    color: {
      type: String
    },
    iconColor: String,
    disabled: {
      type: Boolean,
      default: false
    }
  },
  emits: ["update:modelValue", "change"],
  setup(props, { emit }) {
    const theStyle = computed(() => {
      const { color } = props;
      let s = "";
      if (color)
        s += `--fan-checkbox-active-color:${color};`;
      return s;
    });
    const iSize = computed(() => transformSize(props.size));
    const toggle = () => {
      const val = !props.modelValue;
      emit("update:modelValue", val);
      emit("change", val);
    };
    return { theStyle, iSize, toggle, iconColor: props.iconColor };
  }
});
function __vue_render__$C(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      style: normalizeStyle(_ctx.theStyle),
      class: normalizeClass(["fan-checkbox", { "fan-checkbox--disabled": _ctx.disabled, "fan-checkbox--checked": _ctx.modelValue }]),
      onClick: _cache[0] || (_cache[0] = (...args) => _ctx.toggle && _ctx.toggle(...args))
    },
    [
      createElementVNode(
        "div",
        {
          class: "fan-checkbox__i",
          style: normalizeStyle({ width: _ctx.iSize, height: _ctx.iSize })
        },
        [
          createVNode(_component_FanIcon, {
            name: "check",
            size: `calc(${_ctx.iSize} * 0.8)`,
            color: _ctx.disabled ? "#c8c9cc" : _ctx.iconColor ? _ctx.iconColor : "#fff",
            style: normalizeStyle({ visibility: _ctx.modelValue ? "visible" : "hidden" })
          }, null, 8, ["size", "color", "style"])
        ],
        4
        /* STYLE */
      )
    ],
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$C.render = __vue_render__$C;
var stdin_default$D = __vue_sfc__$C;
const Checkbox = stdin_default$D;
const contactButtonSfc = "";
const contactPanelSfc = "";
const imageSfc = "";
const propsObject = {
  src: String,
  width: [Number, String],
  height: [Number, String],
  aspectRatio: [Number, String],
  mode: {
    type: String,
    default: "",
    validator: (value) => {
      return [
        "",
        "scaleToFill",
        "aspectFit",
        "aspectFill",
        "widthFix"
      ].includes(value);
    }
  },
  /**
   * 圆角
   */
  radius: [Number, String],
  lazyLoad: {
    type: Boolean,
    default: false
  },
  // 占位图片风格，是否白底，默认底 #f1f1f1
  placeholderLight: {
    type: Boolean,
    default: false
  },
  /**
   * 仅小程序有用
   */
  showMenuByLongpress: {
    type: Boolean,
    default: false
  }
};
const __vue_sfc__$B = defineComponent({
  name: createNamespace("Image")[0],
  components: { FanAspectRatio: stdin_default$F },
  emits: ["click", "load"],
  props: propsObject,
  setup(props, context) {
    const radiusStyle = computed(() => {
      return props.radius ? `border-radius:${transformSize(props.radius)};` : "";
    });
    const theStyle = computed(() => {
      return `overflow:hidden;position:relative;${radiusStyle.value}`;
    });
    const aspectRatioNum = computed(() => props.mode === "widthFix" ? 0 : props.aspectRatio);
    const imgStyle = computed(() => {
      const { height, mode } = props;
      const theAS = aspectRatioNum.value;
      let h2 = theAS || height ? "100%" : transformSize(height);
      if (theAS || h2) {
        const fit = mode === "aspectFill" ? "cover" : mode === "aspectFit" ? "contain" : "";
        return `height:${h2};object-fit:${fit};${radiusStyle.value}`;
      }
      return `${radiusStyle.value}`;
    });
    const onClick = (e) => context.emit("click", e);
    const onLoad = (e) => {
      const { naturalWidth, naturalHeight } = e.target;
      context.emit("load", { detail: { width: naturalWidth, height: naturalHeight } });
    };
    return { radiusStyle, theStyle, imgStyle, aspectRatioNum, onClick, onLoad };
  }
});
const _hoisted_1$r = ["src"];
function __vue_render__$B(_ctx, _cache) {
  const _component_FanAspectRatio = resolveComponent("FanAspectRatio");
  const _directive_lazy = resolveDirective("lazy");
  return openBlock(), createBlock(_component_FanAspectRatio, {
    style: normalizeStyle(_ctx.theStyle),
    "aspect-ratio": _ctx.aspectRatioNum,
    width: _ctx.width,
    height: _ctx.height,
    onClick: _ctx.onClick
  }, {
    default: withCtx(() => [
      !_ctx.src ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          style: normalizeStyle("height:100%;" + _ctx.radiusStyle),
          class: normalizeClass(["fan-img--empty", { light: _ctx.placeholderLight }])
        },
        null,
        6
        /* CLASS, STYLE */
      )) : _ctx.lazyLoad ? withDirectives((openBlock(), createElementBlock(
        "img",
        {
          key: 1,
          onLoad: _cache[0] || (_cache[0] = (...args) => _ctx.onLoad && _ctx.onLoad(...args)),
          style: normalizeStyle(_ctx.imgStyle),
          class: "fan-img",
          alt: ""
        },
        null,
        36
        /* STYLE, NEED_HYDRATION */
      )), [
        [_directive_lazy, _ctx.src]
      ]) : (openBlock(), createElementBlock("img", {
        key: 2,
        onLoad: _cache[1] || (_cache[1] = (...args) => _ctx.onLoad && _ctx.onLoad(...args)),
        style: normalizeStyle(_ctx.imgStyle),
        class: "fan-img",
        src: _ctx.src,
        alt: ""
      }, null, 44, _hoisted_1$r)),
      renderSlot(_ctx.$slots, "default")
    ]),
    _: 3
    /* FORWARDED */
  }, 8, ["style", "aspect-ratio", "width", "height", "onClick"]);
}
__vue_sfc__$B.render = __vue_render__$B;
var stdin_default$C = __vue_sfc__$B;
const __vue_sfc__$A = defineComponent({
  name: createNamespace("ContactPanel")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanImage: stdin_default$C },
  props: {
    customStyle: [Object, String],
    phone: String,
    picture: String,
    time: String,
    timeStyle: String,
    phoneLabel: {
      type: String,
      default: "客服电话"
    },
    pictureLabel: {
      type: String,
      default: "客服微信"
    },
    // 图片联系方式的说明文案
    pictureRemark: {
      type: String,
      default: "1.截屏或长按保存二维码\n2.用微信从相册选图 扫一扫识别"
    },
    size: {
      type: String,
      default: "default",
      validator: (value) => {
        return ["default", "large"].includes(value);
      }
    },
    bg: {
      type: String,
      default: "#fff"
    }
  },
  setup(props) {
    const picLongpress = () => {
      dialog({
        title: "是否保存该图片？",
        showCancel: true
      }).then(() => {
        saveImage(props.picture);
      });
    };
    return { picLongpress };
  }
});
const _hoisted_1$q = {
  selectable: "",
  "user-select": ""
};
const _hoisted_2$h = {
  key: 0,
  class: "fan-contact--mg"
};
const _hoisted_3$5 = {
  key: 1,
  class: "fan-contact__remark fan-contact--mg"
};
function __vue_render__$A(_ctx, _cache) {
  const _component_FanImage = resolveComponent("FanImage");
  return openBlock(), createElementBlock(
    "div",
    {
      class: normalizeClass(["fan-contact-panel", { "fan-contact--large": _ctx.size === "large" }])
    },
    [
      _ctx.time ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          style: normalizeStyle(_ctx.timeStyle),
          class: "fan-multi-ellipsis--l2 fan-contact__time"
        },
        "客服工作时间：" + toDisplayString(_ctx.time),
        5
        /* TEXT, STYLE */
      )) : createCommentVNode("v-if", true),
      !_ctx.phone && !_ctx.picture ? (openBlock(), createElementBlock(
        "div",
        {
          key: 1,
          class: "fan-contact__cell",
          style: normalizeStyle({ background: _ctx.bg })
        },
        " 客服有点高冷，木有给联系方式呢！ ",
        4
        /* STYLE */
      )) : createCommentVNode("v-if", true),
      _ctx.phone ? (openBlock(), createElementBlock(
        "div",
        {
          key: 2,
          class: "fan-contact__cell fan-contact__phone",
          style: normalizeStyle({
            background: _ctx.bg,
            marginBottom: !_ctx.picture ? "0" : _ctx.size === "large" ? "18px" : "12px"
          })
        },
        [
          createTextVNode(
            toDisplayString(_ctx.phoneLabel) + "：",
            1
            /* TEXT */
          ),
          createElementVNode(
            "span",
            _hoisted_1$q,
            toDisplayString(_ctx.phone),
            1
            /* TEXT */
          )
        ],
        4
        /* STYLE */
      )) : createCommentVNode("v-if", true),
      _ctx.picture ? (openBlock(), createElementBlock(
        "div",
        {
          key: 3,
          class: "fan-contact__cell",
          style: normalizeStyle({ display: "inline-block", width: "100%", background: _ctx.bg })
        },
        [
          _ctx.pictureLabel ? (openBlock(), createElementBlock(
            "div",
            _hoisted_2$h,
            toDisplayString(_ctx.pictureLabel) + "：",
            1
            /* TEXT */
          )) : createCommentVNode("v-if", true),
          _ctx.pictureRemark ? (openBlock(), createElementBlock(
            "div",
            _hoisted_3$5,
            toDisplayString(_ctx.pictureRemark),
            1
            /* TEXT */
          )) : createCommentVNode("v-if", true),
          createVNode(_component_FanImage, {
            src: _ctx.picture,
            mode: "widthFix",
            width: _ctx.size === "large" ? "100%" : "85%",
            showMenuByLongpress: "",
            style: { "display": "inline-block" },
            onLongpress: _ctx.picLongpress
          }, null, 8, ["src", "width", "onLongpress"])
        ],
        4
        /* STYLE */
      )) : createCommentVNode("v-if", true)
    ],
    2
    /* CLASS */
  );
}
__vue_sfc__$A.render = __vue_render__$A;
var stdin_default$B = __vue_sfc__$A;
const popupSfc = "";
const overlaySfc = "";
const __vue_sfc__$z = defineComponent({
  name: createNamespace("Overlay")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    show: {
      type: Boolean,
      default: false,
      required: true
    },
    zIndex: {
      type: [String, Number],
      default: 1
    },
    duration: {
      type: [String, Number],
      default: 0.3
    },
    lockScroll: {
      type: Boolean,
      default: true
    }
  },
  emits: ["click"],
  setup(props, { emit }) {
    const theStyle = computed(() => {
      const { zIndex, duration } = props;
      return `z-index:${zIndex};--fan-overlay-time:${duration}s;`;
    });
    const isShow = ref(props.show);
    const className = ref("");
    const enter = (show) => {
      if (props.lockScroll)
        document.body.style = "overflow: hidden";
      className.value = "fan-overlay-enter-active";
      isShow.value = show;
      setTimeout(() => {
        className.value = "";
      }, props.duration * 1e3);
    };
    const leave = (show) => {
      className.value = "fan-overlay-leave-active";
      setTimeout(() => {
        isShow.value = show;
        if (props.lockScroll)
          document.body.style = "";
        className.value = "";
      }, props.duration * 1e3);
    };
    const close = () => emit("click");
    const onMove = () => {
    };
    onUnmounted(() => {
      document.body.style = "";
    });
    watch(
      () => props.show,
      (val, old) => {
        if (val === old)
          return;
        val ? enter(val) : leave(val);
      }
    );
    return {
      isShow,
      theStyle,
      className,
      close,
      onMove
    };
  }
});
function __vue_render__$z(_ctx, _cache) {
  return _ctx.isShow ? (openBlock(), createElementBlock(
    "div",
    {
      key: 0,
      class: normalizeClass(["fan-overlay", _ctx.className]),
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      _ctx.lockScroll ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          style: { "width": "100%", "height": "100%" },
          onClick: _cache[0] || (_cache[0] = (...args) => _ctx.close && _ctx.close(...args)),
          onTouchmove: _cache[1] || (_cache[1] = withModifiers((...args) => _ctx.onMove && _ctx.onMove(...args), ["stop"]))
        },
        [
          renderSlot(_ctx.$slots, "default")
        ],
        32
        /* NEED_HYDRATION */
      )) : (openBlock(), createElementBlock("div", {
        key: 1,
        style: { "width": "100%", "height": "100%" },
        onClick: _cache[2] || (_cache[2] = (...args) => _ctx.close && _ctx.close(...args))
      }, [
        renderSlot(_ctx.$slots, "default")
      ]))
    ],
    6
    /* CLASS, STYLE */
  )) : createCommentVNode("v-if", true);
}
__vue_sfc__$z.render = __vue_render__$z;
var stdin_default$A = __vue_sfc__$z;
const __vue_sfc__$y = defineComponent({
  name: createNamespace("Popup")[0],
  components: { FanOverlay: stdin_default$A, FanButton: stdin_default$H },
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    show: {
      type: Boolean,
      default: false,
      required: true
    },
    customStyle: [String, Object],
    position: {
      type: String,
      validator(value) {
        return ["center", "top", "bottom", "right", "left"].includes(value);
      },
      default: "center"
    },
    /**
     * 圆角
     * @default 12px
     * @description true-默认值 false-0
     */
    round: {
      type: [Boolean, Number, String],
      default: "12px"
    },
    zIndex: {
      type: [String, Number],
      default: 1e3
    },
    duration: {
      type: [String, Number],
      default: 0.3
    },
    title: String,
    titleAlign: {
      type: String,
      default: "center",
      validator: (value) => ["left", "center", "right"].includes(value)
    },
    overlayStyle: {
      type: [Object, String]
    },
    closeOnClickOverlay: {
      type: Boolean,
      default: true
    },
    closeable: {
      type: Boolean,
      default: false
    },
    closeIcon: {
      type: String,
      default: "close"
    },
    closeIconColor: {
      type: String,
      default: "#c8c9cc"
    },
    lockScroll: {
      type: Boolean,
      default: true
    },
    // 底部安全区域
    safeBottom: {
      type: Boolean,
      default: true
    }
  },
  emits: ["update:show", "clickOverlay", "closed"],
  setup(props, { emit }) {
    const overlayShow = ref(props.show);
    const innerShow = ref(props.show);
    const time = ref(null);
    const className = ref("");
    const enter = () => {
      innerShow.value = true;
      className.value = `fan-popup-${props.position}-enter-from`;
      setTimeout(() => {
        className.value = "";
      }, 0);
    };
    const leave = () => {
      className.value = `fan-popup-${props.position}-leave-active`;
      time.value = setTimeout(() => {
        className.value = "";
        innerShow.value = false;
        emit("update:show", false);
        emit("closed");
      }, props.duration * 1e3);
    };
    watch(
      () => props.show,
      (val) => {
        if (className.value)
          return;
        overlayShow.value = val;
        clearTimeout(time.value);
        val ? enter() : leave();
      }
    );
    const theStyle = computed(() => {
      const { customStyle, round, zIndex, duration } = props;
      const obj = {
        zIndex,
        "--fan-popup-time": `${duration}s`
      };
      if (round !== false && Number(round) !== 0) {
        obj["--fan-popup-radius"] = transformSize(round === true || !Number(round) ? "12px" : round);
      }
      return transformStyleSize(customStyle) + transformStyleSize(obj);
    });
    const overlayClick = () => {
      emit("clickOverlay");
      if (!props.closeOnClickOverlay)
        return;
      emit("update:show", false);
    };
    return { overlayShow, innerShow, theStyle, className, leave, overlayClick };
  }
});
function __vue_render__$y(_ctx, _cache) {
  const _component_FanOverlay = resolveComponent("FanOverlay");
  const _component_FanButton = resolveComponent("FanButton");
  return openBlock(), createElementBlock(
    Fragment,
    null,
    [
      createVNode(_component_FanOverlay, {
        style: normalizeStyle(_ctx.overlayStyle),
        show: _ctx.overlayShow,
        "z-index": _ctx.zIndex,
        duration: _ctx.duration,
        "lock-scroll": _ctx.lockScroll,
        onClick: _ctx.overlayClick
      }, null, 8, ["style", "show", "z-index", "duration", "lock-scroll", "onClick"]),
      _ctx.innerShow ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          class: normalizeClass(["fan-popup", "fan-popup--" + _ctx.position, { safe: _ctx.safeBottom }, _ctx.className]),
          style: normalizeStyle(_ctx.theStyle)
        },
        [
          _ctx.title ? (openBlock(), createElementBlock(
            "div",
            {
              key: 0,
              class: normalizeClass(["fan-popup__title", "fan-popup__title--" + _ctx.titleAlign])
            },
            toDisplayString(_ctx.title),
            3
            /* TEXT, CLASS */
          )) : createCommentVNode("v-if", true),
          renderSlot(_ctx.$slots, "default"),
          _ctx.closeable ? (openBlock(), createBlock(_component_FanButton, {
            key: 1,
            style: { "position": "absolute", "top": "0", "right": "2px" },
            "icon-size": "16",
            padding: "0",
            width: "40px",
            icon: _ctx.closeIcon,
            color: _ctx.closeIconColor,
            border: false,
            plain: true,
            onClick: _ctx.leave
          }, null, 8, ["icon", "color", "onClick"])) : createCommentVNode("v-if", true)
        ],
        6
        /* CLASS, STYLE */
      )) : createCommentVNode("v-if", true)
    ],
    64
    /* STABLE_FRAGMENT */
  );
}
__vue_sfc__$y.render = __vue_render__$y;
var stdin_default$z = __vue_sfc__$y;
const __vue_sfc__$x = defineComponent({
  name: createNamespace("ContactButton")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["click"],
  components: { FanButton: stdin_default$H, FanContactPanel: stdin_default$B, FanPopup: stdin_default$z },
  props: {
    customStyle: [Object, String],
    // 优先级最高
    phone: String,
    picture: String,
    time: String,
    timeStyle: String,
    url: String,
    // 小程序客服按钮配置 {}
    mpContact: {
      type: Object,
      default: () => ({})
    },
    /**
     * 是否以绝对定位撑满父盒子，可以作为遮罩mask使用
     */
    full: {
      type: Boolean,
      default: false
    }
  },
  setup(props, { emit }) {
    const useMpContact = computed(() => {
      const { phone, picture, url } = props;
      const { runEnv: runEnv2, mpPlugin } = Config;
      return !url && !phone && !picture && runEnv2 === "mp" && !mpPlugin;
    });
    const theStyle = computed(() => transformStyleSize(props.customStyle));
    const showPop = ref(false);
    const onClick = () => {
      if (props.url) {
        emit("click", props.url);
        return;
      }
      showPop.value = true;
    };
    return { theStyle, useMpContact, showPop, onClick };
  }
});
const _hoisted_1$p = ["show-message-card", "send-message-title", "send-message-path", "send-message-img"];
const _hoisted_2$g = {
  class: "fan-hairline--top fan-hairline--bottom",
  style: { "padding": "24px 12px 30px" }
};
function __vue_render__$x(_ctx, _cache) {
  const _component_FanContactPanel = resolveComponent("FanContactPanel");
  const _component_FanButton = resolveComponent("FanButton");
  const _component_FanPopup = resolveComponent("FanPopup");
  return _ctx.useMpContact ? (openBlock(), createElementBlock("button", {
    key: 0,
    class: normalizeClass(["fan-contact-btn", { "fan-contact-btn--full": _ctx.full }]),
    style: normalizeStyle(_ctx.theStyle),
    "open-type": "contact",
    "show-message-card": !!_ctx.mpContact.img,
    "send-message-title": _ctx.mpContact.title,
    "send-message-path": _ctx.mpContact.path,
    "send-message-img": _ctx.mpContact.img
  }, [
    renderSlot(_ctx.$slots, "default")
  ], 14, _hoisted_1$p)) : (openBlock(), createElementBlock(
    Fragment,
    { key: 1 },
    [
      createElementVNode(
        "div",
        {
          class: normalizeClass(["fan-contact-btn", { "fan-contact-btn--full": _ctx.full }]),
          style: normalizeStyle(_ctx.theStyle),
          onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))
        },
        [
          renderSlot(_ctx.$slots, "default")
        ],
        6
        /* CLASS, STYLE */
      ),
      createVNode(_component_FanPopup, {
        show: _ctx.showPop,
        "onUpdate:show": _cache[2] || (_cache[2] = ($event) => _ctx.showPop = $event),
        title: "客服联系方式",
        round: "",
        "custom-style": { width: "82%" }
      }, {
        default: withCtx(() => [
          createElementVNode("div", _hoisted_2$g, [
            createVNode(_component_FanContactPanel, {
              phone: _ctx.phone,
              picture: _ctx.picture,
              time: _ctx.time,
              "time-style": _ctx.timeStyle,
              background: "var(--fan-primary-color-1)"
            }, null, 8, ["phone", "picture", "time", "time-style"])
          ]),
          createVNode(_component_FanButton, {
            block: "",
            plain: "",
            border: false,
            "text-size": "16px",
            onClick: _cache[1] || (_cache[1] = ($event) => _ctx.showPop = false)
          }, {
            default: withCtx(() => _cache[3] || (_cache[3] = [
              createTextVNode("关闭")
            ])),
            _: 1
            /* STABLE */
          })
        ]),
        _: 1
        /* STABLE */
      }, 8, ["show"])
    ],
    64
    /* STABLE_FRAGMENT */
  ));
}
__vue_sfc__$x.render = __vue_render__$x;
var stdin_default$y = __vue_sfc__$x;
const ContactButton = stdin_default$y;
const ContactPanel = stdin_default$B;
function isSameSecond(time1, time2) {
  return Math.floor(time1 / 1e3) === Math.floor(time2 / 1e3);
}
function simRaf(fn) {
  return setTimeout(fn, 1e3 / 60);
}
function raf(fn) {
  const rr = simRaf;
  return rr(fn);
}
function cancelRaf(id) {
  const rr = clearTimeout;
  rr(id);
}
const __vue_sfc__$w = defineComponent({
  name: createNamespace("CountDown")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    // 毫秒时间戳
    time: {
      type: [String, Number]
    },
    autoStart: {
      type: Boolean,
      default: true
    },
    // 默认 时分秒，可以指定一个统一的分隔符，TODO: 分别指定
    separator: {
      type: String
    },
    daySeparator: {
      type: [String, Object]
    },
    separatorStyle: {
      type: String
    },
    blockStyle: {
      type: String
    },
    // 要天不
    day: {
      type: Boolean,
      default: false
    },
    hour: {
      type: Boolean,
      default: true
    },
    minute: {
      type: Boolean,
      default: true
    },
    // 要毫秒不
    millisecond: {
      type: [Boolean, String],
      default: false
    },
    // 毫秒前面加0
    doubleDigitMill: {
      type: Boolean,
      default: false
    }
  },
  emits: ["finish"],
  setup(props, context) {
    const theBlockStyle = computed(() => transformStyleSize(props.blockStyle));
    const theSepStyle = computed(
      () => transformStyleSize(props.separatorStyle)
    );
    let tid;
    let counting;
    let remain = 0;
    let endTime = 0;
    const timeData = ref(parseTimeData(0));
    const pause = () => {
      counting = false;
      cancelRaf(tid);
    };
    const setRemain = (value) => {
      remain = value;
      timeData.value = parseTimeData(value, props.day);
      if (value === 0) {
        pause();
        context.emit("finish");
      }
    };
    const getRemain = () => {
      return Math.max(endTime - Date.now(), 0);
    };
    const microTick = () => {
      tid = raf(() => {
        setRemain(getRemain());
        if (remain !== 0) {
          microTick();
        }
      });
    };
    const macroTick = () => {
      tid = raf(() => {
        const value = getRemain();
        if (!isSameSecond(value, remain) || value === 0) {
          setRemain(value);
        }
        if (remain !== 0) {
          macroTick();
        }
      });
    };
    const tick = () => {
      props.millisecond ? microTick() : macroTick();
    };
    const start = () => {
      if (counting)
        return;
      counting = true;
      endTime = Date.now() + remain;
      tick();
    };
    const reset = () => {
      pause();
      if (!props.time)
        return;
      remain = props.time;
      setRemain(remain);
      props.autoStart && start();
    };
    watch(() => props.time, reset, { immediate: true });
    onBeforeUnmount(() => {
      cancelRaf(tid);
      tid = null;
    });
    return { theBlockStyle, theSepStyle, timeData, reset };
  }
});
const _hoisted_1$o = { class: "fan-flex fan-align-center fan-count-down" };
function __vue_render__$w(_ctx, _cache) {
  return openBlock(), createElementBlock("div", _hoisted_1$o, [
    _ctx.day ? (openBlock(), createElementBlock(
      Fragment,
      { key: 0 },
      [
        createElementVNode(
          "div",
          {
            style: normalizeStyle(_ctx.theBlockStyle),
            class: "fan-count-down__block"
          },
          toDisplayString(_ctx.timeData.days),
          5
          /* TEXT, STYLE */
        ),
        createElementVNode(
          "div",
          {
            style: normalizeStyle(_ctx.theSepStyle),
            class: "fan-count-down__sep"
          },
          toDisplayString(_ctx.daySeparator ? _ctx.daySeparator : "天"),
          5
          /* TEXT, STYLE */
        )
      ],
      64
      /* STABLE_FRAGMENT */
    )) : createCommentVNode("v-if", true),
    _ctx.hour ? (openBlock(), createElementBlock(
      Fragment,
      { key: 1 },
      [
        createElementVNode(
          "div",
          {
            style: normalizeStyle(_ctx.theBlockStyle),
            class: "fan-count-down__block"
          },
          toDisplayString(_ctx.timeData.hours),
          5
          /* TEXT, STYLE */
        ),
        createElementVNode(
          "div",
          {
            style: normalizeStyle(_ctx.theSepStyle),
            class: "fan-count-down__sep"
          },
          toDisplayString(_ctx.separator ? _ctx.separator : "时"),
          5
          /* TEXT, STYLE */
        )
      ],
      64
      /* STABLE_FRAGMENT */
    )) : createCommentVNode("v-if", true),
    _ctx.minute ? (openBlock(), createElementBlock(
      Fragment,
      { key: 2 },
      [
        createElementVNode(
          "div",
          {
            style: normalizeStyle(_ctx.theBlockStyle),
            class: "fan-count-down__block"
          },
          toDisplayString(_ctx.timeData.minutes),
          5
          /* TEXT, STYLE */
        ),
        createElementVNode(
          "div",
          {
            style: normalizeStyle(_ctx.theSepStyle),
            class: "fan-count-down__sep"
          },
          toDisplayString(_ctx.separator ? _ctx.separator : "分"),
          5
          /* TEXT, STYLE */
        )
      ],
      64
      /* STABLE_FRAGMENT */
    )) : createCommentVNode("v-if", true),
    createElementVNode(
      "div",
      {
        style: normalizeStyle(_ctx.theBlockStyle),
        class: "fan-count-down__block"
      },
      toDisplayString(_ctx.timeData.seconds),
      5
      /* TEXT, STYLE */
    ),
    _ctx.millisecond || !_ctx.separator ? (openBlock(), createElementBlock(
      "div",
      {
        key: 3,
        style: normalizeStyle(_ctx.theSepStyle),
        class: "fan-count-down__sep"
      },
      toDisplayString(_ctx.separator ? _ctx.separator : "秒"),
      5
      /* TEXT, STYLE */
    )) : createCommentVNode("v-if", true),
    _ctx.millisecond ? (openBlock(), createElementBlock(
      "div",
      {
        key: 4,
        style: normalizeStyle(_ctx.theBlockStyle),
        class: "fan-count-down__block"
      },
      toDisplayString(_ctx.doubleDigitMill ? "0" : "") + toDisplayString(_ctx.timeData.milliseconds),
      5
      /* TEXT, STYLE */
    )) : createCommentVNode("v-if", true)
  ]);
}
__vue_sfc__$w.render = __vue_render__$w;
var stdin_default$x = __vue_sfc__$w;
const CountDown = stdin_default$x;
const countToSfc = "";
const __vue_sfc__$v = defineComponent({
  name: createNamespace("CountTo")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["finish"],
  props: {
    startNum: {
      type: [Number, String],
      default: 0
    },
    endNum: {
      type: [Number, String],
      default: 0
    },
    step: {
      type: [Number, String],
      default: 1
    },
    // 数字切换的时间 单位为秒
    speed: {
      type: [Number, String],
      default: 1
    },
    // 数字切换时动画的时间 单位为秒
    duration: [String, Number],
    color: String,
    bg: String,
    textSize: [String, Number],
    bold: [String, Number],
    height: [String, Number],
    width: [String, Number],
    symbolWidth: [String, Number],
    radius: [String, Number],
    marginRight: [Number, String],
    lineHeight: [Number, String]
  },
  setup(props, { emit }) {
    const numList = ref([0]);
    const startVal = ref(props.startNum);
    const endVal = ref(props.endNum);
    let decimalLength = 0;
    let isMinus = false;
    let timer = null;
    const initNumList = (start, end) => {
      var _a, _b, _c, _d, _e, _f, _g, _h;
      start = start.split(".");
      end = end.split(".");
      const step = String(props.step).split(".");
      let startNum = JSON.parse(JSON.stringify(start));
      const maxIntegerLength = Math.max(((_a = start[0]) == null ? void 0 : _a.length) || 0, ((_b = end[0]) == null ? void 0 : _b.length) || 0, ((_c = step[0]) == null ? void 0 : _c.length) || 0), maxDecimalLength = Math.max(((_d = start[1]) == null ? void 0 : _d.length) || 0, ((_e = end[1]) == null ? void 0 : _e.length) || 0, ((_f = step[1]) == null ? void 0 : _f.length) || 0);
      decimalLength = maxDecimalLength;
      if (((_g = start[0]) == null ? void 0 : _g.length) < maxIntegerLength)
        startNum[0] = padNumber(startNum[0], maxIntegerLength);
      if (!start[1] && maxDecimalLength !== 0) {
        startNum[1] = padNumber(0, maxDecimalLength);
      } else if (((_h = start[1]) == null ? void 0 : _h.length) < maxDecimalLength) {
        startNum[1] = padNumber(startNum[1], maxDecimalLength, { right: true });
      }
      return startNum.length === 2 ? startNum.join(".").split("") : startNum.join("").split("");
    };
    const translateList = computed(() => {
      const translate = [];
      numList.value.forEach((num) => translate.push(`transform: translate(0, -${num * 10}%)`));
      return translate;
    });
    const theStyle = computed(() => {
      const {
        bg,
        textSize,
        bold,
        color,
        height,
        radius,
        width,
        duration,
        marginRight,
        symbolWidth,
        lineHeight
      } = props;
      let s = "";
      if (bg)
        s += `--fan-count-to-bg: ${bg};`;
      if (textSize)
        s += `--fan-count-to-size: ${transformSize(textSize)};--fan-count-to-height: ${transformSize(
          parseFloat(textSize) * 1.4
        )};`;
      if (bold)
        s += `--fan-count-to-weight: ${bold};`;
      if (color)
        s += `--fan-count-to-color: ${color};`;
      if (radius)
        s += `--fan-count-to-radius: ${transformSize(radius)};`;
      if (height)
        s += `--fan-count-to-height: ${transformSize(height)};`;
      if (width)
        s += `--fan-count-to-width: ${transformSize(width)};`;
      if (marginRight)
        s += `--fan-count-to-margin: ${transformSize(marginRight)};`;
      if (duration)
        s += `--fan-count-to-duration:${duration}s;`;
      if (symbolWidth)
        s += `--fan-count-to-symbol-width:${transformSize(symbolWidth)}`;
      if (lineHeight)
        s += `--fan-count-to-line-height: ${transformSize(lineHeight)}`;
      return transformStyleSize(s);
    });
    watchEffect(() => {
      const start = String(startVal.value), end = String(endVal.value);
      if (startVal.value > endVal.value)
        isMinus = true;
      numList.value = initNumList(start, end);
    });
    const onFinish = () => {
      clearInterval(timer);
      timer = null;
      emit("finish");
    };
    const increaseNumber = () => {
      const { step, speed } = props;
      if (Number(startVal.value) === Number(endVal.value))
        return;
      timer = setInterval(() => {
        if (isMinus) {
          startVal.value = roundNumber(Number(startVal.value) - Number(step), decimalLength);
          if (Number(startVal.value) <= Number(endVal.value))
            return onFinish();
        } else {
          startVal.value = roundNumber(Number(startVal.value) + Number(step), decimalLength);
          if (Number(startVal.value) >= Number(endVal.value))
            return onFinish();
        }
      }, Number(speed) * 1e3);
    };
    watch(
      () => props.endNum,
      (val) => endVal.value = val,
      { immediate: true }
    );
    watch(
      () => props.startNum,
      (val) => startVal.value = val,
      { immediate: true }
    );
    onMounted(() => increaseNumber());
    onUnmounted(() => clearInterval(timer));
    return {
      theStyle,
      translateList,
      numList
    };
  }
});
const _hoisted_1$n = { class: "fan-flex fan-align-center" };
const _hoisted_2$f = { key: 1 };
function __vue_render__$v(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: "count-to",
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      createElementVNode("div", _hoisted_1$n, [
        (openBlock(true), createElementBlock(
          Fragment,
          null,
          renderList(_ctx.numList, (item, i) => {
            return openBlock(), createElementBlock(
              "div",
              {
                class: normalizeClass(["count-to_num", [isNaN(item) ? "number_symbol" : "number-item"]]),
                key: i
              },
              [
                !isNaN(item) ? (openBlock(), createElementBlock(
                  "span",
                  {
                    key: 0,
                    class: "number-item_num",
                    style: normalizeStyle(_ctx.translateList[i])
                  },
                  [..._cache[0] || (_cache[0] = [
                    createElementVNode(
                      "span",
                      { class: "number-item_num_box" },
                      [
                        createElementVNode("span", { class: "number-item_num__txt" }, "0123456789")
                      ],
                      -1
                      /* HOISTED */
                    )
                  ])],
                  4
                  /* STYLE */
                )) : (openBlock(), createElementBlock(
                  "span",
                  _hoisted_2$f,
                  toDisplayString(item),
                  1
                  /* TEXT */
                ))
              ],
              2
              /* CLASS */
            );
          }),
          128
          /* KEYED_FRAGMENT */
        ))
      ])
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$v.render = __vue_render__$v;
var stdin_default$w = __vue_sfc__$v;
const CountTo = stdin_default$w;
const dataPanelSfc = "";
const __vue_sfc__$u = defineComponent({
  name: createNamespace("DataPanel")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    // [{ label, value }, ...]
    data: Array,
    column: {
      type: Number,
      default: 0
    }
  },
  setup(props) {
    const colClass = computed(() => {
      const { column, data } = props;
      if (!data)
        return "";
      if (!column) {
        const l = data.length;
        if (l < 4)
          return "col" + l;
        return "col" + (l % 3 === 0 || l % 3 === 2 ? 3 : 2);
      }
      return "col" + column;
    });
    return { colClass };
  }
});
const _hoisted_1$m = { class: "fan-flex fan-data-panel__in" };
const _hoisted_2$e = { class: "fan-data-panel__val" };
const _hoisted_3$4 = { class: "fan-data-panel__t" };
function __vue_render__$u(_ctx, _cache) {
  return _ctx.data && _ctx.data.length ? (openBlock(), createElementBlock(
    "div",
    {
      key: 0,
      class: normalizeClass(["fan-data-panel", _ctx.colClass])
    },
    [
      createElementVNode("div", _hoisted_1$m, [
        (openBlock(true), createElementBlock(
          Fragment,
          null,
          renderList(_ctx.data, (item, index) => {
            return openBlock(), createElementBlock("div", {
              key: index,
              class: "fan-flex-col fan-justify-center fan-align-center fan-data-panel__item"
            }, [
              createElementVNode(
                "div",
                _hoisted_2$e,
                toDisplayString(item.value),
                1
                /* TEXT */
              ),
              createElementVNode(
                "div",
                _hoisted_3$4,
                toDisplayString(item.label),
                1
                /* TEXT */
              )
            ]);
          }),
          128
          /* KEYED_FRAGMENT */
        ))
      ])
    ],
    2
    /* CLASS */
  )) : createCommentVNode("v-if", true);
}
__vue_sfc__$u.render = __vue_render__$u;
var stdin_default$v = __vue_sfc__$u;
const DataPanel = stdin_default$v;
const pickerSfc = "";
const textSfc = "";
const __vue_sfc__$t = defineComponent({
  name: createNamespace("Text")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["click"],
  components: { FanIcon: stdin_default$K },
  props: {
    // 是否显示内层白框
    inner: {
      type: Boolean,
      default: false
    },
    innerRadius: {
      type: String,
      default: ""
    },
    text: {
      type: String,
      default: ""
    },
    textSize: {
      type: [String, Number],
      default: "14"
    },
    bold: {
      type: [Boolean, Number, String],
      default: false
    },
    align: {
      type: String,
      default: "left"
      // center, right
    },
    color: {
      type: String
    },
    // 行高
    lineHeight: {
      type: [String, Number],
      default: 1.4
    },
    // 图标前缀
    prefixIcon: {
      type: String
    },
    iconSize: {
      type: [String, Number]
    },
    iconRadius: {
      type: String,
      default: "4px"
    },
    iconColor: String,
    // 图标与文字间距
    iconSpace: {
      type: [String, Number]
    },
    // 最多展示行数，超出显示省略号，目前只支持 1，2，3
    line: Number
  },
  setup(props, context) {
    const theStyle = computed(() => {
      const {
        textSize,
        bold,
        align,
        color,
        lineHeight,
        iconSize,
        iconSpace
      } = props;
      let s = "";
      let theIconSize = transformSize(iconSize);
      const fsize = transformSize(textSize);
      const fsizeValue = parseFloat(fsize, 10);
      const lh = String(lineHeight).includes("px") ? parseFloat(String(lineHeight)) / fsizeValue : lineHeight;
      if (fsizeValue) {
        if (!theIconSize) {
          const unit = fsize.replace(/[0-9.]/g, "");
          theIconSize = fsizeValue * 1.2 + unit;
        }
        s += `font-size:${fsize};`;
      }
      if (lh) {
        s += `line-height:${lh};`;
      }
      if (bold) {
        if (typeof bold === "number" || typeof bold === "string" && Number(bold) >= 100) {
          s += `font-weight:${bold};`;
        } else {
          s += `font-weight:var(--fan-text-mbold);`;
        }
      }
      if (align) {
        s += `text-align:${align};`;
      }
      if (color) {
        s += `color:${color};`;
      }
      let ibox = "";
      if (["number", "string"].includes(typeof iconSpace))
        ibox += `margin-right:${transformSize(iconSpace)};`;
      return {
        style: s,
        iconSize: theIconSize,
        ibox
      };
    });
    const onClick = (e) => {
      context.emit("click", e);
    };
    return { theStyle, onClick };
  }
});
function __vue_render__$t(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      style: normalizeStyle(_ctx.theStyle.style),
      class: "fan-bg-container fan2-text",
      onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))
    },
    [
      createElementVNode(
        "div",
        {
          class: normalizeClass(["fan2-text__inner", [
            { box: _ctx.inner },
            { "fan-ellipsis": _ctx.line === 1 },
            { "fan-multi-ellipsis--l2": _ctx.line === 2 },
            { "fan-multi-ellipsis--l3": _ctx.line === 3 }
          ]]),
          style: normalizeStyle({ borderRadius: _ctx.innerRadius })
        },
        [
          createCommentVNode(" 小程序文本外的属性不识别 em 尺寸 "),
          _ctx.prefixIcon ? (openBlock(), createElementBlock(
            "div",
            {
              key: 0,
              class: "fan2-text__icon",
              style: normalizeStyle(_ctx.theStyle.ibox)
            },
            [
              createVNode(_component_FanIcon, {
                name: _ctx.prefixIcon,
                size: _ctx.theStyle.iconSize,
                color: _ctx.iconColor,
                "vertical-align": "middle",
                "custom-style": { borderRadius: _ctx.iconRadius }
              }, null, 8, ["name", "size", "color", "custom-style"])
            ],
            4
            /* STYLE */
          )) : createCommentVNode("v-if", true),
          createElementVNode(
            "span",
            {
              "user-select": "",
              selectable: "",
              space: "nbsp",
              class: "fan2-text__span",
              style: normalizeStyle({ verticalAlign: !_ctx.prefixIcon ? "baseline" : "middle" })
            },
            [
              createTextVNode(
                toDisplayString(_ctx.text) + " ",
                1
                /* TEXT */
              ),
              renderSlot(_ctx.$slots, "default")
            ],
            4
            /* STYLE */
          )
        ],
        6
        /* CLASS, STYLE */
      )
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$t.render = __vue_render__$t;
var stdin_default$u = __vue_sfc__$t;
const pickerColumnSfc = "";
const __vue_sfc__$s = defineComponent({
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    items: Array,
    value: Array,
    index: Number,
    valueKey: String
  },
  emits: ["selectItem"],
  setup(props, { emit }) {
    const currentOffset = ref(110);
    const selectVal = ref();
    const selectInd = ref();
    let start = 0;
    let newOffset = currentOffset.value;
    const colStyle = computed(() => {
      const s = `transform: translate3d(0, ${currentOffset.value}PX, 0)`;
      return transformStyleSize(s);
    });
    const onTouchstart = (e) => {
      selectVal.value = null;
      selectInd.value = null;
      start = e.touches[0].screenY;
      newOffset = currentOffset.value;
    };
    const onTouchmove = (e) => {
      if (!props.items.find((item) => !item.disabled))
        return;
      const y = e.touches[0].screenY;
      if (y > start) {
        currentOffset.value = newOffset + (y - start);
      } else {
        currentOffset.value = newOffset - (start - y);
      }
    };
    const onTouchEnd = (items) => {
      var _a;
      if (!(items == null ? void 0 : items.find((item) => !item.disabled)))
        return;
      let i = Number(
        String(Math.floor(currentOffset.value / 44) - 2).replace(/\-/g, "")
      );
      if (typeof selectInd.value === "number")
        i = selectInd.value;
      if (i > props.items.length - 1) {
        i = props.items.length - 1;
      } else if (currentOffset.value > 110) {
        currentOffset.value = 110;
        i = 0;
      }
      if (items && ((_a = items[i]) == null ? void 0 : _a.disabled)) {
        selectInd.value = i += 1;
        if (selectInd.value >= items.length)
          selectInd.value -= 2;
        onTouchEnd(items);
        return;
      }
      currentOffset.value = 110 - i * 44;
      let key = i;
      if (props.valueKey)
        key = items[i][props.valueKey];
      selectVal.value = key;
      emit("selectItem", { level: props.index, select: key, index: i });
    };
    const onClick = (item, index) => {
      if (item.disabled)
        return;
      selectInd.value = index;
      onTouchEnd(props.items);
    };
    watch(
      () => props.value,
      (val) => {
        let isData = false;
        if (val.length && val.some((s) => !!s))
          isData = true;
        const list = [...val];
        if (isData && selectVal.value !== list[props.index]) {
          selectVal.value = list[props.index];
          const i = props.items.findIndex((item, i2) => {
            if (props.valueKey) {
              return item[props.valueKey] === selectVal.value;
            } else {
              return i2 === selectVal.value;
            }
          });
          selectInd.value = i >= 0 ? i : 0;
          onTouchEnd(props.items);
        }
      },
      {
        immediate: true,
        deep: true
      }
    );
    return {
      currentOffset,
      colStyle,
      onTouchstart,
      onTouchmove,
      onTouchEnd,
      onClick
    };
  }
});
const _hoisted_1$l = ["onClick"];
const _hoisted_2$d = { class: "fan-ellipsis" };
function __vue_render__$s(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: "fan-picker__box",
      onTouchstart: _cache[0] || (_cache[0] = (...args) => _ctx.onTouchstart && _ctx.onTouchstart(...args)),
      onTouchmove: _cache[1] || (_cache[1] = withModifiers((...args) => _ctx.onTouchmove && _ctx.onTouchmove(...args), ["prevent"])),
      onTouchend: _cache[2] || (_cache[2] = ($event) => _ctx.onTouchEnd(_ctx.items)),
      onTouchcancel: _cache[3] || (_cache[3] = ($event) => _ctx.onTouchEnd(_ctx.items))
    },
    [
      createElementVNode(
        "div",
        {
          class: "fan-picker__l",
          style: normalizeStyle(_ctx.colStyle)
        },
        [
          (openBlock(true), createElementBlock(
            Fragment,
            null,
            renderList(_ctx.items, (item, i) => {
              return openBlock(), createElementBlock("div", {
                key: i,
                class: normalizeClass(["fan-flex-center fan-picker__txt", { "fan-picker__d": item.disabled }]),
                style: { height: "44PX" },
                onClick: ($event) => _ctx.onClick(item, i)
              }, [
                createElementVNode(
                  "div",
                  _hoisted_2$d,
                  toDisplayString(item.text),
                  1
                  /* TEXT */
                )
              ], 10, _hoisted_1$l);
            }),
            128
            /* KEYED_FRAGMENT */
          ))
        ],
        4
        /* STYLE */
      )
    ],
    32
    /* NEED_HYDRATION */
  );
}
__vue_sfc__$s.render = __vue_render__$s;
var stdin_default$t = __vue_sfc__$s;
const __vue_sfc__$r = defineComponent({
  name: createNamespace("Picker")[0],
  options: { virtualHost: true },
  emits: ["confirm", "cancel", "update:modelValue", "update:show"],
  components: { FanPopup: stdin_default$z, FanButton: stdin_default$H, FanText: stdin_default$u, PickerColumn: stdin_default$t },
  props: {
    modelValue: {
      type: Array,
      default: () => []
    },
    show: {
      type: Boolean,
      default: false
    },
    title: String,
    cancelText: {
      type: String,
      default: "取消"
    },
    confirmText: {
      type: String,
      default: "确认"
    },
    data: Array,
    valueKey: String,
    textKey: {
      type: String,
      default: "text"
    }
  },
  setup(props, { emit }) {
    const state = reactive({
      innerShow: props.show,
      list: [],
      selectValue: props.modelValue && props.modelValue.length ? [...props.modelValue] : []
    });
    let isCascade = false;
    const instance2 = getCurrentInstance();
    const selectItem = (val) => {
      if (state.selectValue[val.level] !== val.select) {
        state.selectValue[val.level] = val.select;
        if (isCascade) {
          const d2 = state.list[val.level][val.index];
          state.list.splice(val.level + 1, state.list.length);
          if ((d2 == null ? void 0 : d2.children) && (d2 == null ? void 0 : d2.children.length))
            formatCascade({
              data: d2.children,
              key: props.textKey,
              arr: state.list
            });
          state.list.forEach((_item, i) => {
            var _a;
            if (i > val.level) {
              state.selectValue[i] = (_a = state.list[i]) == null ? void 0 : _a.findIndex(
                (item) => !item.disabled
              );
              nextTick(() => {
                const column = instance2.refs.column.sort(
                  (a, b2) => a.index - b2.index
                );
                column[i].onTouchEnd(state.list[i]);
              });
            }
          });
        }
      }
    };
    const onConfirm = () => emit("confirm", state.selectValue);
    const onCancel = () => {
      state.innerShow = false;
      emit("cancel");
    };
    const formatCascade = ({ data, key, arr }) => {
      const l = data.map((item) => ({
        text: item[key],
        disabled: !!(item == null ? void 0 : item.disabled),
        [props.valueKey]: item[props.valueKey],
        children: item.children
      }));
      arr.push(l);
      if (l[0].children && l[0].children.length)
        formatCascade({ data: l[0].children, key, arr });
    };
    const init = ({ data, key, arr }) => {
      if (data && data.length) {
        if (typeof data[0] === "string") {
          if (!state.selectValue.length)
            state.selectValue = [0];
          arr.push(data.map((text) => ({ text, disabled: false })));
        } else if (Array.isArray(data[0])) {
          data.forEach((items, i) => {
            arr.push([]);
            items.forEach((item) => {
              arr[i].push({
                disabled: !!(item == null ? void 0 : item.disabled),
                text: item[key],
                [props.valueKey]: item[props.valueKey]
              });
            });
          });
          if (!state.selectValue.length) {
            state.selectValue = [];
            arr.forEach((items) => {
              const index = items.findIndex((item) => {
                if (!item.disabled)
                  return true;
              });
              state.selectValue.push(
                props.valueKey ? items[index][props.valueKey] : index
              );
            });
          }
        } else {
          isCascade = true;
          formatCascade({ data, key, arr });
          if (!state.selectValue.length) {
            state.selectValue = [];
            setTimeout(() => {
              state.list.forEach((items) => {
                const index = items.findIndex((item) => {
                  if (!item.disabled)
                    return true;
                });
                state.selectValue.push(
                  props.valueKey ? items[index][props.valueKey] : index
                );
              });
            }, 0);
          }
        }
      }
    };
    watch(
      () => props.modelValue,
      (val) => {
        if (val)
          state.selectValue = [...val];
      },
      { deep: true }
    );
    watch(
      () => state.selectValue,
      (val) => {
        let alike = false;
        if (val.find((item, i) => item !== props.modelValue[i]))
          alike = true;
        if (alike)
          emit("update:modelValue", val);
      },
      { deep: true }
    );
    watch(
      () => props.show,
      (val) => state.innerShow = val
    );
    watch(
      () => state.innerShow,
      (val) => emit("update:show", val)
    );
    watch(
      () => props.data,
      (data) => {
        if (data && data.length) {
          const arr = [];
          init({ data, key: props.textKey, arr });
          state.list = arr;
        }
      },
      { immediate: true, deep: true }
    );
    return { state, onConfirm, onCancel, selectItem };
  }
});
const _hoisted_1$k = {
  key: 1,
  class: "fan-picker__o fan-flex fan-align-center fan-justify-between"
};
const _hoisted_2$c = { class: "fan-picker__c" };
function __vue_render__$r(_ctx, _cache) {
  const _component_FanButton = resolveComponent("FanButton");
  const _component_FanText = resolveComponent("FanText");
  const _component_PickerColumn = resolveComponent("PickerColumn");
  const _component_FanPopup = resolveComponent("FanPopup");
  return openBlock(), createBlock(_component_FanPopup, {
    show: _ctx.state.innerShow,
    "onUpdate:show": _cache[0] || (_cache[0] = ($event) => _ctx.state.innerShow = $event),
    "safe-bottom": "",
    position: "bottom"
  }, {
    default: withCtx(() => [
      createElementVNode("div", null, [
        _ctx.$slots.header ? renderSlot(_ctx.$slots, "header", { key: 0 }) : (openBlock(), createElementBlock("div", _hoisted_1$k, [
          createVNode(_component_FanButton, {
            plain: "",
            border: false,
            "text-size": "14",
            "text-color": "#969799",
            onClick: _ctx.onCancel
          }, {
            default: withCtx(() => [
              createTextVNode(
                toDisplayString(_ctx.cancelText),
                1
                /* TEXT */
              )
            ]),
            _: 1
            /* STABLE */
          }, 8, ["onClick"]),
          createVNode(_component_FanText, {
            bold: "",
            "text-size": "18",
            color: "#333"
          }, {
            default: withCtx(() => [
              createTextVNode(
                toDisplayString(_ctx.title),
                1
                /* TEXT */
              )
            ]),
            _: 1
            /* STABLE */
          }),
          createVNode(_component_FanButton, {
            plain: "",
            border: false,
            "text-size": "14",
            "text-color": "var(--fan-primary-color)",
            onClick: _ctx.onConfirm
          }, {
            default: withCtx(() => [
              createTextVNode(
                toDisplayString(_ctx.confirmText),
                1
                /* TEXT */
              )
            ]),
            _: 1
            /* STABLE */
          }, 8, ["onClick"])
        ])),
        createElementVNode("div", _hoisted_2$c, [
          (openBlock(true), createElementBlock(
            Fragment,
            null,
            renderList(_ctx.state.list, (item, i) => {
              return openBlock(), createBlock(_component_PickerColumn, {
                ref_for: true,
                ref: "column",
                key: i,
                items: item,
                value: _ctx.state.selectValue,
                index: i,
                "value-key": _ctx.valueKey,
                onSelectItem: _ctx.selectItem
              }, null, 8, ["items", "value", "index", "value-key", "onSelectItem"]);
            }),
            128
            /* KEYED_FRAGMENT */
          )),
          _cache[1] || (_cache[1] = createElementVNode(
            "div",
            {
              class: "fan-picker__b",
              style: { height: "44PX", top: "132PX" }
            },
            null,
            -1
            /* HOISTED */
          )),
          _cache[2] || (_cache[2] = createElementVNode(
            "div",
            { class: "fan-picker__mask" },
            null,
            -1
            /* HOISTED */
          ))
        ])
      ])
    ]),
    _: 3
    /* FORWARDED */
  }, 8, ["show"]);
}
__vue_sfc__$r.render = __vue_render__$r;
var stdin_default$s = __vue_sfc__$r;
const __vue_sfc__$q = defineComponent({
  name: createNamespace("DatePicker")[0],
  options: { virtualHost: true },
  emits: ["update:show", "update:modelValue", "confirm", "cancel"],
  components: { FanPicker: stdin_default$s },
  props: {
    modelValue: {
      type: Array,
      default: () => []
    },
    show: {
      type: Boolean,
      default: false
    },
    title: String,
    minDate: Date,
    maxDate: Date,
    filter: {
      type: [Function, null],
      default: null
    },
    cancelText: {
      type: String,
      default: "取消"
    },
    confirmText: {
      type: String,
      default: "确认"
    }
  },
  setup(props, { emit }) {
    const state = reactive({
      innerShow: props.show,
      value: props.modelValue,
      list: []
    });
    const formatDate = (list) => {
      if (props.filter)
        state.list = props.filter(list);
      else
        state.list = list;
    };
    const d2 = /* @__PURE__ */ new Date();
    let minYear = d2.getFullYear() - 10;
    let maxYear = d2.getFullYear() + 10;
    const formatItem = (num, type, i, isSub) => {
      return Array.from({ length: num }, (_, index) => ({
        text: index + 1 < 10 ? `0${index + 1}` : String(index + 1),
        id: index + 1 < 10 ? `0${index + 1}` : String(index + 1),
        type,
        children: isSub ? fillDate(minYear + i, index + 1) : []
      }));
    };
    const init = () => {
      if (props.minDate)
        minYear = props.minDate.getFullYear();
      if (props.maxDate)
        maxYear = props.maxDate.getFullYear();
      if (minYear > maxYear) {
        const min = maxYear;
        maxYear = minYear;
        minYear = min;
      }
      const num = maxYear - minYear;
      const list = [];
      for (let i = 0; i <= num; i++) {
        list.push({
          text: String(minYear + i),
          id: String(minYear + i),
          type: "year",
          children: formatItem(12, "month", i, true)
        });
      }
      formatDate(list);
    };
    const fillDate = (year, month) => {
      const lm = [1, 3, 5, 7, 8, 10, 12];
      const sm = [4, 6, 9, 11];
      if (lm.includes(month))
        return formatItem(31, "day");
      else if (sm.includes(month))
        return formatItem(30, "day");
      else if (year % 4 === 0 && year % 100 !== 0 || year % 400 === 0)
        return formatItem(29, "day");
      else
        return formatItem(28, "day");
    };
    const onConfirm = (val) => emit("confirm", val);
    const onCancel = () => emit("cancel");
    watch(props.modelValue, (val) => {
      state.value = [...val];
    }, { deep: true });
    watch(() => state.value, (val) => {
      emit("update:modelValue", val);
    }, { deep: true });
    watch(() => props.show, (val) => state.innerShow = val);
    watch(() => state.innerShow, (val) => emit("update:show", val));
    init();
    return { state, onConfirm, onCancel };
  }
});
function __vue_render__$q(_ctx, _cache) {
  const _component_FanPicker = resolveComponent("FanPicker");
  return openBlock(), createBlock(_component_FanPicker, {
    modelValue: _ctx.state.value,
    "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.state.value = $event),
    show: _ctx.state.innerShow,
    "onUpdate:show": _cache[1] || (_cache[1] = ($event) => _ctx.state.innerShow = $event),
    data: _ctx.state.list,
    "value-key": "id",
    title: _ctx.title,
    "cancel-text": _ctx.cancelText,
    "confirm-text": _ctx.confirmText,
    onConfirm: _ctx.onConfirm,
    onCancel: _ctx.onCancel
  }, createSlots({
    _: 2
    /* DYNAMIC */
  }, [
    _ctx.$slots.default ? {
      name: "header",
      fn: withCtx(() => [
        renderSlot(_ctx.$slots, "default")
      ]),
      key: "0"
    } : void 0
  ]), 1032, ["modelValue", "show", "data", "title", "cancel-text", "confirm-text", "onConfirm", "onCancel"]);
}
__vue_sfc__$q.render = __vue_render__$q;
var stdin_default$r = __vue_sfc__$q;
const DatePicker = stdin_default$r;
const Dialog = stdin_default$G;
const dropdownItemSfc = "";
function useParent(key) {
  const parent = inject(key, null);
  if (parent) {
    const instance2 = getCurrentInstance();
    const { link, unlink, internalChildren } = parent;
    link(instance2);
    onUnmounted(() => unlink(instance2));
    const index = computed(() => internalChildren.indexOf(instance2));
    return {
      parent,
      index
    };
  }
  return {
    parent: null,
    index: ref(-1)
  };
}
const scrollViewSfc = "";
const scrollViewProps = {
  customStyle: [String, Object],
  width: [Number, String],
  height: [Number, String],
  maxHeight: [Number, String],
  scrollY: {
    type: [Boolean, String],
    default: false
  },
  scrollX: {
    type: [Boolean, String],
    default: false
  },
  scrollable: {
    type: Boolean,
    default: true
  },
  /**
   * 距顶部/左边多远时（单位px），触发 scrolltoupper 事件
   */
  upperThreshold: {
    type: [Number, String],
    default: 50
  },
  /**
   * 距底部/右边多远时（单位px），触发 scrolltolower 事件
   */
  lowerThreshold: {
    type: [Number, String],
    default: 50
  },
  /**
   * 设置竖向滚动条位置
   */
  scrollTop: [Number, String],
  /**
   * 设置横向滚动条位置
   */
  scrollLeft: [Number, String],
  scrollWithAnimation: {
    type: Boolean,
    default: false
  },
  /**
   * iOS点击顶部状态栏、安卓双击标题栏时，滚动条返回顶部，只支持竖向
   * @description 仅 app-nvue，微信小程序
   */
  enableBackToTop: {
    type: [Number, String],
    default: 50
  },
  /**
   * 启用 flexbox 布局。开启后，当前节点声明了 display: flex 就会成为 flex container，并作用于其孩子节点
   */
  enableFlex: {
    type: Boolean,
    default: false
  }
};
const scrollViewEmits = ["scrolltoupper", "scrolltolower", "scroll"];
const __vue_sfc__$p = defineComponent({
  name: createNamespace("ScrollView")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: scrollViewProps,
  emits: scrollViewEmits,
  setup(props, context) {
    const theStyle = computed(() => {
      const { width, height, maxHeight, scrollY, scrollX, enableFlex, customStyle } = props;
      let style = "";
      if (width)
        style += `width:${transformSize(width)};`;
      if (height)
        style += `height:${transformSize(height)};`;
      if (maxHeight)
        style += `max-height:${transformSize(maxHeight)};`;
      if (scrollX)
        style += `white-space:nowrap;`;
      style += `overflow-x:${scrollX ? "auto" : "hidden"};overflow-y:${scrollY ? "auto" : "hidden"};`;
      if (enableFlex)
        style += "display:flex;";
      return transformStyleSize(customStyle) + style;
    });
    const el = ref(null);
    const scrollPositionSource = ref([0, 0]);
    const scrollPosition = useTransition(scrollPositionSource, {
      delay: 0,
      duration: 290,
      disabled: !props.scrollWithAnimation,
      transition: TransitionPresets.linear
    });
    const setScrollPosition = ([left, top]) => {
      if (!el.value)
        return;
      el.value.scrollLeft = left;
      el.value.scrollTop = top;
    };
    watch(scrollPosition, setScrollPosition);
    watch(
      () => props.scrollLeft,
      (val) => {
        scrollPositionSource.value = [val, scrollPositionSource.value[1]];
      }
    );
    watch(
      () => props.scrollTop,
      (val) => {
        scrollPositionSource.value = [scrollPositionSource.value[0], val];
      }
    );
    onMounted(() => {
      scrollPositionSource.value = [props.scrollLeft || 0, props.scrollTop || 0];
    });
    const { x, y, arrivedState } = useScroll(el, {
      offset: {
        right: props.lowerThreshold,
        bottom: props.lowerThreshold,
        left: props.upperThreshold,
        top: props.upperThreshold
      },
      onScroll: () => {
        context.emit("scroll", { detail: { scrollLeft: x.value, scrollTop: y.value } });
      }
    });
    watch(arrivedState, ({ left, right, top, bottom }) => {
      const { scrollY, scrollX } = props;
      if (scrollY) {
        if (bottom)
          context.emit("scrolltolower");
        if (top)
          context.emit("scrolltoupper");
      }
      if (scrollX) {
        if (right)
          context.emit("scrolltolower");
        if (left)
          context.emit("scrolltoupper");
      }
    });
    return { theStyle, el };
  }
});
const _hoisted_1$j = {
  key: 0,
  class: "fan-scroll-view--flex"
};
function __vue_render__$p(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      ref: "el",
      class: "fan-scroll-view",
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      _ctx.enableFlex && _ctx.scrollX && _ctx.scrollable ? (openBlock(), createElementBlock("div", _hoisted_1$j, [
        renderSlot(_ctx.$slots, "default")
      ])) : renderSlot(_ctx.$slots, "default", { key: 1 })
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$p.render = __vue_render__$p;
var stdin_default$q = __vue_sfc__$p;
const __vue_sfc__$o = defineComponent({
  name: createNamespace("DropdownItemContent")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanScrollView: stdin_default$q },
  props: {
    scroll: {
      type: Boolean,
      default: false
    },
    scrollHeight: {
      type: [String, Boolean],
      default: "61.8vh"
    }
  }
});
function __vue_render__$o(_ctx, _cache) {
  const _component_FanScrollView = resolveComponent("FanScrollView");
  return _ctx.scroll ? (openBlock(), createBlock(_component_FanScrollView, {
    key: 0,
    height: _ctx.scrollHeight,
    "scroll-y": true
  }, {
    default: withCtx(() => [
      renderSlot(_ctx.$slots, "default")
    ]),
    _: 3
    /* FORWARDED */
  }, 8, ["height"])) : renderSlot(_ctx.$slots, "default", { key: 1 });
}
__vue_sfc__$o.render = __vue_render__$o;
var stdin_default$p = __vue_sfc__$o;
const __vue_sfc__$n = defineComponent({
  name: createNamespace("DropdownItem")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K, DropdownItemContent: stdin_default$p },
  props: {
    contentStyle: [String, Object],
    title: String,
    modelValue: {
      type: [Number, String],
      default: 0
    },
    active: Boolean,
    // 设为false则不显示图标
    icon: {
      type: [String, Boolean],
      default: ""
    },
    iconSize: {
      type: [String, Number],
      default: "12px"
    },
    options: {
      type: Array,
      default: () => []
    },
    /**
     * option-title 取值
     */
    titleProp: {
      type: String,
      default: "text"
    },
    /**
     * modelValue 的值的来源，默认 options 数组下标
     */
    valueProp: {
      type: String,
      default: "value"
    },
    disabled: {
      type: Boolean,
      default: false
    },
    // 选项内容是否使用滚动区域
    scroll: {
      type: Boolean,
      default: false
    },
    scrollHeight: {
      type: String,
      default: "61.8vh"
    },
    // 支付宝小程序无法通过 slots.default 自动判断，这个时候需要该属性 https://ask.dcloud.net.cn/question/136765
    // 是否自定义下拉内容，即使用插槽
    customContent: {
      type: Boolean,
      default: false
    }
  },
  expose: ["toggle"],
  emits: ["update:modelValue", "change", "update:title"],
  setup(props, context) {
    const showWrapper = ref();
    const theIcon = computed(() => {
      let name = props.icon !== false ? props.icon || "caret-down" : "";
      if (name === "caret-down" && showWrapper.value)
        name = "caret-up";
      return {
        name,
        color: props.active || showWrapper.value || props.icon ? "currentColor" : "rgba(0,0,0,0.1)"
      };
    });
    const theContentStyle = computed(
      () => transformStyleSize(props.contentStyle)
    );
    const formatOptions = (data, titleProp, valueProp) => {
      if (!(data == null ? void 0 : data.length))
        return null;
      return data.map((a, i) => {
        return {
          title: titleProp ? a[titleProp] : a,
          value: valueProp ? a[valueProp] : i,
          children: formatOptions(a.children, titleProp, valueProp)
        };
      });
    };
    const theOptions = computed(() => {
      const { options, titleProp, valueProp } = props;
      return formatOptions(options, titleProp, valueProp) || [];
    });
    const column2 = computed(() => {
      return theOptions.value.some((a) => a.children);
    });
    const column1Active = ref(0);
    const setColumn1Active = (val) => {
      var _a;
      if (typeof val !== "undefined") {
        column1Active.value = val;
        return;
      }
      if (!column2.value)
        return;
      const item1 = theOptions.value.find((a) => {
        var _a2;
        if (!((_a2 = a.children) == null ? void 0 : _a2.length))
          return a.value === props.modelValue;
        return a.children.some((b2) => b2.value === props.modelValue);
      });
      const newVal = item1 ? item1.value : ((_a = theOptions.value[0]) == null ? void 0 : _a.value) || 0;
      if (column1Active.value !== newVal) {
        column1Active.value = newVal;
      }
    };
    watch(
      () => props.modelValue,
      (val) => setColumn1Active(val),
      { immediate: true }
    );
    const column2Options = computed(() => {
      const item1 = theOptions.value.find(
        (a) => a.value === column1Active.value
      );
      return (item1 == null ? void 0 : item1.children) || [];
    });
    const { parent } = useParent("fanDropdownMenu");
    const offsetStyle = computed(() => {
      return `top:${parent.offset.value}px;`;
    });
    const animateContent = ref(false);
    const animateBg = ref(false);
    const toggle = (show = !showWrapper.value, options) => {
      if (props.disabled || !context.slots.default && !props.customContent && !theOptions.value.length || show === showWrapper.value) {
        return;
      }
      showWrapper.value = show;
      if (show) {
        setColumn1Active();
        animateContent.value = true;
        if (typeof (options == null ? void 0 : options.immediateBg) === "undefined" || !options.immediateBg)
          animateBg.value = true;
        setTimeout(() => {
          animateContent.value = false;
          animateBg.value = false;
        }, 1e3 / 60);
      }
    };
    const emptyFunc = () => null;
    const itemClick = (opt) => {
      const val = opt.value;
      if (opt.children) {
        setColumn1Active(val);
        return;
      }
      if (val !== props.modelValue) {
        context.emit("update:modelValue", val);
        nextTick(() => {
          context.emit("update:title", opt.title);
          context.emit("change", val, opt);
        });
      }
      toggle();
    };
    return {
      theIcon,
      showWrapper,
      theContentStyle,
      offsetStyle,
      animateContent,
      animateBg,
      theOptions,
      column2,
      column2Options,
      column1Active,
      toggle,
      emptyFunc,
      itemClick
    };
  }
});
const _hoisted_1$i = { class: "fan-dropdown-item" };
const _hoisted_2$b = {
  key: 0,
  class: "fan-flex"
};
const _hoisted_3$3 = { class: "fan-dropdown-item__col1" };
const _hoisted_4$3 = ["onClick"];
const _hoisted_5$1 = { class: "fan-flex-1 fan-ellipsis" };
const _hoisted_6$1 = { class: "fan-dropdown-item__col2" };
const _hoisted_7 = ["onClick"];
const _hoisted_8 = { class: "fan-flex-1 fan-ellipsis" };
const _hoisted_9 = ["onClick"];
const _hoisted_10 = { class: "fan-flex-1 fan-ellipsis" };
function __vue_render__$n(_ctx, _cache) {
  const _component_DropdownItemContent = resolveComponent("DropdownItemContent");
  const _component_FanIcon = resolveComponent("FanIcon");
  return withDirectives((openBlock(), createElementBlock(
    "div",
    _hoisted_1$i,
    [
      createElementVNode("div", {
        class: "fan-dropdown-item__overlay",
        onClick: _cache[0] || (_cache[0] = withModifiers(($event) => _ctx.toggle(false), ["stop"]))
      }),
      createElementVNode(
        "div",
        {
          style: normalizeStyle(_ctx.offsetStyle),
          class: "fan-dropdown-item__main"
        },
        [
          createElementVNode(
            "div",
            {
              class: normalizeClass(["fan-dropdown-item__bg", { "fan-dropdown--fade": _ctx.animateBg }]),
              onClick: _cache[1] || (_cache[1] = withModifiers(($event) => _ctx.toggle(false), ["stop"]))
            },
            null,
            2
            /* CLASS */
          ),
          createElementVNode(
            "div",
            {
              style: normalizeStyle(_ctx.theContentStyle),
              class: normalizeClass(["fan-dropdown-item__content", { "fan-dropdown--slide": _ctx.animateContent }])
            },
            [
              _ctx.column2 ? (openBlock(), createElementBlock("div", _hoisted_2$b, [
                createElementVNode("div", _hoisted_3$3, [
                  createVNode(_component_DropdownItemContent, {
                    scroll: _ctx.scroll,
                    "scroll-height": _ctx.scrollHeight
                  }, {
                    default: withCtx(() => [
                      (openBlock(true), createElementBlock(
                        Fragment,
                        null,
                        renderList(_ctx.theOptions, (opt, index) => {
                          return openBlock(), createElementBlock("div", {
                            key: index,
                            class: normalizeClass(["fan-dropdown-item__cell", {
                              "fan-dropdown-item--active": _ctx.column1Active === opt.value
                            }]),
                            onClick: ($event) => _ctx.itemClick(opt)
                          }, [
                            createElementVNode(
                              "div",
                              _hoisted_5$1,
                              toDisplayString(opt.title),
                              1
                              /* TEXT */
                            )
                          ], 10, _hoisted_4$3);
                        }),
                        128
                        /* KEYED_FRAGMENT */
                      ))
                    ]),
                    _: 1
                    /* STABLE */
                  }, 8, ["scroll", "scroll-height"])
                ]),
                createElementVNode("div", _hoisted_6$1, [
                  createVNode(_component_DropdownItemContent, {
                    scroll: _ctx.scroll,
                    "scroll-height": _ctx.scrollHeight
                  }, {
                    default: withCtx(() => [
                      (openBlock(true), createElementBlock(
                        Fragment,
                        null,
                        renderList(_ctx.column2Options, (opt, index) => {
                          return openBlock(), createElementBlock("div", {
                            key: index,
                            class: normalizeClass(["fan-hairline--bottom fan-dropdown-item__cell", {
                              "fan-dropdown-item--active": _ctx.modelValue === opt.value
                            }]),
                            onClick: ($event) => _ctx.itemClick(opt)
                          }, [
                            createElementVNode(
                              "div",
                              _hoisted_8,
                              toDisplayString(opt.title),
                              1
                              /* TEXT */
                            ),
                            _ctx.modelValue === opt.value ? (openBlock(), createBlock(_component_FanIcon, {
                              key: 0,
                              name: "check-circle-fill",
                              color: "var(--fan-dropdown-active-color)",
                              size: "18px"
                            })) : createCommentVNode("v-if", true)
                          ], 10, _hoisted_7);
                        }),
                        128
                        /* KEYED_FRAGMENT */
                      ))
                    ]),
                    _: 1
                    /* STABLE */
                  }, 8, ["scroll", "scroll-height"])
                ])
              ])) : (openBlock(), createBlock(_component_DropdownItemContent, {
                key: 1,
                scroll: _ctx.scroll,
                "scroll-height": _ctx.scrollHeight
              }, {
                default: withCtx(() => [
                  (openBlock(true), createElementBlock(
                    Fragment,
                    null,
                    renderList(_ctx.theOptions, (opt, index) => {
                      return openBlock(), createElementBlock("div", {
                        key: index,
                        class: normalizeClass(["fan-hairline--bottom fan-dropdown-item__cell", { "fan-dropdown-item--active": _ctx.modelValue === opt.value }]),
                        onClick: ($event) => _ctx.itemClick(opt)
                      }, [
                        createElementVNode(
                          "div",
                          _hoisted_10,
                          toDisplayString(opt.title),
                          1
                          /* TEXT */
                        ),
                        _ctx.modelValue === opt.value ? (openBlock(), createBlock(_component_FanIcon, {
                          key: 0,
                          name: "check-circle-fill",
                          color: "var(--fan-dropdown-active-color)",
                          size: "18px"
                        })) : createCommentVNode("v-if", true)
                      ], 10, _hoisted_9);
                    }),
                    128
                    /* KEYED_FRAGMENT */
                  ))
                ]),
                _: 1
                /* STABLE */
              }, 8, ["scroll", "scroll-height"])),
              renderSlot(_ctx.$slots, "default")
            ],
            6
            /* CLASS, STYLE */
          )
        ],
        4
        /* STYLE */
      )
    ],
    512
    /* NEED_PATCH */
  )), [
    [vShow, _ctx.showWrapper]
  ]);
}
__vue_sfc__$n.render = __vue_render__$n;
var stdin_default$o = __vue_sfc__$n;
const DropdownItem = stdin_default$o;
const dropdownMenuSfc = "";
function flattenVNodes(children) {
  const result = [];
  const traverse = (children2) => {
    if (Array.isArray(children2)) {
      children2.forEach((child) => {
        var _a;
        if (isVNode(child)) {
          result.push(child);
          if ((_a = child.component) == null ? void 0 : _a.subTree) {
            result.push(child.component.subTree);
            traverse(child.component.subTree.children);
          }
          if (child.children) {
            traverse(child.children);
          }
        }
      });
    }
  };
  traverse(children);
  return result;
}
function sortChildren(parent, publicChildren, internalChildren) {
  const vnodes = flattenVNodes(parent.subTree.children);
  internalChildren.sort(
    (a, b2) => vnodes.indexOf(a.vnode) - vnodes.indexOf(b2.vnode)
  );
  const orderedPublicChildren = internalChildren.map((item) => item.proxy);
  publicChildren.sort((a, b2) => {
    const indexA = orderedPublicChildren.indexOf(a);
    const indexB = orderedPublicChildren.indexOf(b2);
    return indexA - indexB;
  });
}
function useChildren(key) {
  const publicChildren = reactive([]);
  const internalChildren = reactive([]);
  const parent = getCurrentInstance();
  const linkChildren = (value) => {
    const link = (child) => {
      if (child.proxy) {
        internalChildren.push(child);
        publicChildren.push(child.proxy);
        sortChildren(parent, publicChildren, internalChildren);
      }
    };
    const unlink = (child) => {
      const index = internalChildren.indexOf(child);
      publicChildren.splice(index, 1);
      internalChildren.splice(index, 1);
    };
    provide(
      key,
      Object.assign(
        {
          link,
          unlink,
          children: publicChildren,
          internalChildren
        },
        value
      )
    );
  };
  return {
    children: publicChildren,
    linkChildren
  };
}
const usePageLifecycle = () => {
  const inBrowser = typeof window !== "undefined";
  let deactivated = false;
  onActivated(() => {
    deactivated = false;
  });
  onDeactivated(() => {
    deactivated = true;
  });
  const onPageShow = (hook) => {
    onActivated(hook);
    const visibility = useDocumentVisibility();
    watch(
      visibility,
      (val) => {
        if (deactivated)
          return;
        val === "visible" && hook();
      },
      { immediate: true }
    );
  };
  const onPageHide = (hook) => {
    onDeactivated(hook);
    const visibility = useDocumentVisibility();
    watch(visibility, (val) => {
      if (deactivated)
        return;
      val === "hidden" && hook();
    });
  };
  const onPageScroll = (hook) => {
    if (!inBrowser)
      return;
    const { y } = useScroll(window, {
      onScroll: () => {
        if (deactivated)
          return;
        hook({ scrollTop: y.value });
      }
    });
  };
  const onPageReachBottom = (hook) => {
    if (!inBrowser)
      return;
    useInfiniteScroll(
      window,
      () => {
        if (deactivated)
          return;
        hook();
      },
      { distance: 10 }
    );
  };
  const pageScrollTo = (opt) => {
    document.documentElement.scrollTop = document.body.scrollTop = opt.scrollTop;
  };
  return {
    onPageShow,
    onPageHide,
    onPageScroll,
    onPageReachBottom,
    pageScrollTo
  };
};
var __async$4 = (__this, __arguments, generator) => {
  return new Promise((resolve, reject) => {
    var fulfilled = (value) => {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    };
    var rejected = (value) => {
      try {
        step(generator.throw(value));
      } catch (e) {
        reject(e);
      }
    };
    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
    step((generator = generator.apply(__this, __arguments)).next());
  });
};
const __vue_sfc__$m = defineComponent({
  name: createNamespace("DropdownMenu")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K },
  props: {
    customStyle: [Object, String],
    border: Boolean,
    offset: {
      type: Number,
      default: 0
    },
    zIndex: Number,
    height: [String, Number],
    color: String,
    activeColor: String
  },
  emits: ["toggle"],
  setup(props, { emit }) {
    const slots = useSlots();
    const _this = getCurrentInstance();
    const innerOffset = ref(0);
    const barStyle = computed(() => {
      const { customStyle, height, color } = props;
      let s = "";
      if (color)
        s += `color:${color};`;
      if (height)
        s += `height:${transformSize(height)};`;
      return transformStyleSize(customStyle) + s;
    });
    const containerStyle = computed(() => {
      const { activeColor, zIndex } = props;
      let s = "";
      if (activeColor)
        s += `--fan-dropdown-active-color:${activeColor};`;
      if (zIndex)
        s += `--fan-dropdown-menu-zindex:${zIndex};`;
      return s;
    });
    const { children, linkChildren } = useChildren("fanDropdownMenu");
    const opened = computed(
      () => children.some((item) => {
        var _a;
        return (_a = item.state) == null ? void 0 : _a.showWrapper;
      })
    );
    let bodyOverflow = "";
    watch(opened, (val) => {
      const bodyStyle = document.body.style;
      if (val) {
        bodyOverflow = bodyStyle.overflow;
        bodyStyle.setProperty("overflow", "hidden", "important");
      } else {
        bodyStyle.setProperty("overflow", bodyOverflow);
      }
      emit("toggle", { opened: val });
    });
    linkChildren({ props, offset: innerOffset });
    const { pageScrollTo, onPageScroll } = usePageLifecycle();
    let scrollTop = 0;
    onPageScroll((e) => {
      scrollTop = e.scrollTop;
    });
    const itemClick = (i) => __async$4(this, null, function* () {
      const item = children[i];
      const _opened = opened.value;
      if (!item.showWrapper && _opened) {
        children.forEach((a) => a.toggle(false));
      }
      const rect = yield getElementBounding({
        selector: ".fan-dropdown-menu__bar",
        scope: _this
      });
      if (props.offset === null) {
        innerOffset.value = (rect == null ? void 0 : rect.bottom) || 0;
      } else {
        pageScrollTo({
          scrollTop: scrollTop + ((rect == null ? void 0 : rect.top) || 0) - props.offset,
          duration: 0
        });
        innerOffset.value = (props.offset || 0) + ((rect == null ? void 0 : rect.height) || 0);
      }
      item.toggle(void 0, { immediateBg: _opened });
    });
    const emptyFunc = () => null;
    return {
      barStyle,
      containerStyle,
      children,
      opened,
      itemClick,
      emptyFunc,
      slots
    };
  }
});
const _hoisted_1$h = ["onClick"];
const _hoisted_2$a = { class: "fan-ellipsis" };
function __vue_render__$m(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      style: normalizeStyle(_ctx.containerStyle),
      class: "fan-dropdown-menu"
    },
    [
      _ctx.slots.title ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          style: normalizeStyle(_ctx.barStyle),
          class: normalizeClass(["fan-dropdown-menu__bar", {
            "fan-hairline--bottom": _ctx.border,
            "fan-dropdown-menu__bar--opened": _ctx.opened
          }]),
          onTouchmove: _cache[0] || (_cache[0] = withModifiers((...args) => _ctx.emptyFunc && _ctx.emptyFunc(...args), ["stop", "prevent"]))
        },
        [
          renderSlot(_ctx.$slots, "title")
        ],
        38
        /* CLASS, STYLE, NEED_HYDRATION */
      )) : (openBlock(), createElementBlock(
        "div",
        {
          key: 1,
          style: normalizeStyle(_ctx.barStyle),
          class: normalizeClass(["fan-dropdown-menu__bar", {
            "fan-hairline--bottom": _ctx.border,
            "fan-dropdown-menu__bar--opened": _ctx.opened
          }]),
          onTouchmove: _cache[1] || (_cache[1] = withModifiers((...args) => _ctx.emptyFunc && _ctx.emptyFunc(...args), ["stop", "prevent"]))
        },
        [
          (openBlock(true), createElementBlock(
            Fragment,
            null,
            renderList(_ctx.children, (item, index) => {
              return openBlock(), createElementBlock("div", {
                key: index,
                class: normalizeClass(["fan-dropdown-menu__item", {
                  "fan-dropdown-menu--active": item.active || item.showWrapper
                }]),
                onClick: ($event) => _ctx.itemClick(index)
              }, [
                createElementVNode(
                  "div",
                  _hoisted_2$a,
                  toDisplayString(item.title),
                  1
                  /* TEXT */
                ),
                item.theIcon.name ? (openBlock(), createBlock(_component_FanIcon, {
                  key: 0,
                  name: item.theIcon.name,
                  size: item.iconSize,
                  color: item.theIcon.color,
                  "custom-style": "margin:1px 0 0 3px;"
                }, null, 8, ["name", "size", "color"])) : createCommentVNode("v-if", true)
              ], 10, _hoisted_1$h);
            }),
            128
            /* KEYED_FRAGMENT */
          ))
        ],
        38
        /* CLASS, STYLE, NEED_HYDRATION */
      )),
      renderSlot(_ctx.$slots, "default")
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$m.render = __vue_render__$m;
var stdin_default$n = __vue_sfc__$m;
const DropdownMenu = stdin_default$n;
const emptySfc = "";
const __vue_sfc__$l = defineComponent({
  name: createNamespace("Empoty")[0],
  options: { virtualHost: true },
  components: { FanImage: stdin_default$C },
  props: {
    image: {
      type: String,
      default: "https://img.dac6.cn/fre/saas/empty-box.png"
    },
    imageSize: {
      type: [Number, String, Array],
      default: 100
    },
    messageStyle: [Object, String],
    message: {
      type: String,
      default: "暂无内容"
    },
    // 是否识别 \n 等
    pre: {
      type: Boolean,
      default: false
    }
  },
  setup(props) {
    const imageStyle = computed(() => {
      let style = props.imageSize;
      if (!Array.isArray(props.imageSize))
        style = [props.imageSize, props.imageSize];
      return style;
    });
    const msgStyle = computed(() => transformStyleSize(props.messageStyle));
    return {
      imageStyle,
      msgStyle
    };
  }
});
const _hoisted_1$g = { class: "fan-empty" };
const _hoisted_2$9 = { class: "fan-empty__bottom" };
function __vue_render__$l(_ctx, _cache) {
  const _component_FanImage = resolveComponent("FanImage");
  return openBlock(), createElementBlock("div", _hoisted_1$g, [
    createVNode(_component_FanImage, {
      src: _ctx.image,
      width: _ctx.imageStyle[0],
      height: _ctx.imageStyle[1]
    }, null, 8, ["src", "width", "height"]),
    _ctx.message ? (openBlock(), createElementBlock(
      "p",
      {
        key: 0,
        class: normalizeClass(["fan-empty__msg", { pre: _ctx.pre }]),
        style: normalizeStyle(_ctx.msgStyle)
      },
      toDisplayString(_ctx.message),
      7
      /* TEXT, CLASS, STYLE */
    )) : createCommentVNode("v-if", true),
    createElementVNode("div", _hoisted_2$9, [
      renderSlot(_ctx.$slots, "default")
    ])
  ]);
}
__vue_sfc__$l.render = __vue_render__$l;
var stdin_default$m = __vue_sfc__$l;
const Empty = stdin_default$m;
const Icon = stdin_default$K;
const Image = stdin_default$C;
const inputSfc = "";
const __vue_sfc__$k = defineComponent({
  name: createNamespace("Input")[0],
  components: { FanIcon: stdin_default$K },
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    readonly: {
      type: Boolean,
      default: false
    },
    maxlength: {
      type: Number,
      default: -1
    },
    disabled: {
      type: Boolean,
      default: false
    },
    modelValue: {
      type: [String, Number],
      default: ""
    },
    prefixIcon: String,
    prefixColor: {
      type: String,
      default: "var(--fan-black-2)"
    },
    prefixSize: {
      type: [String, Number],
      default: 17
    },
    suffixIcon: String,
    suffixColor: {
      type: String,
      default: "var(--fan-black-2)"
    },
    suffixSize: {
      type: [String, Number],
      default: 17
    },
    // TODO: 小程序特有属性渐进增强
    type: {
      type: String,
      default: "text"
    },
    inputStyle: String,
    placeholder: String,
    autofocus: Boolean,
    placeholderColor: {
      type: String,
      default: "#C4C7CC"
    },
    clearable: {
      type: Boolean,
      default: false
    },
    clearIcon: {
      type: String,
      default: "close-circle-fill"
    },
    label: String,
    labelStyle: String,
    border: {
      type: Boolean,
      default: false
    }
  },
  emits: [
    "update:modelValue",
    "input",
    "change",
    "confirm",
    "blur",
    "focus",
    "clear"
  ],
  setup(props, context) {
    const theStyle = computed(() => {
      return `--fan-input-placeholder-color:${props.placeholderColor};`;
    });
    const inStyle = computed(() => transformStyleSize(props.inputStyle));
    const labStyle = computed(() => transformStyleSize(props.labelStyle));
    const innerValue = ref("");
    watch(innerValue, (val) => {
      if (val !== props.modelValue)
        context.emit("update:modelValue", val);
      context.emit("input", val);
    });
    watch(
      () => props.modelValue,
      (val) => {
        if (val !== innerValue.value)
          innerValue.value = val;
      },
      { immediate: true }
    );
    const handleInput = (e) => {
      innerValue.value = e.target.value;
    };
    const handleChange = (e) => {
      context.emit(e, innerValue.value);
    };
    const onClear = () => {
      innerValue.value = "";
      context.emit("clear", "");
    };
    const focused = ref(false);
    const onFocus = (e) => {
      focused.value = true;
      context.emit("focus", e);
    };
    const onBlur = (e) => {
      setTimeout(() => {
        focused.value = false;
      }, 300);
      context.emit("blur", e);
    };
    return {
      theStyle,
      inStyle,
      labStyle,
      innerValue,
      focused,
      handleInput,
      handleChange,
      onClear,
      onFocus,
      onBlur
    };
  }
});
const _hoisted_1$f = ["type", "value", "maxlength", "readonly", "disabled", "autofocus", "placeholder", "placeholder-style"];
function __vue_render__$k(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      style: normalizeStyle(_ctx.theStyle),
      class: normalizeClass(["fan-input__wrap", { "fan-hairline--bottom": _ctx.border }])
    },
    [
      _ctx.prefixIcon ? (openBlock(), createBlock(_component_FanIcon, {
        key: 0,
        name: _ctx.prefixIcon,
        color: _ctx.prefixColor,
        size: _ctx.prefixSize,
        style: { "margin-right": "4px" }
      }, null, 8, ["name", "color", "size"])) : createCommentVNode("v-if", true),
      _ctx.label ? (openBlock(), createElementBlock(
        "div",
        {
          key: 1,
          style: normalizeStyle(_ctx.labStyle),
          class: "fan-input__label"
        },
        toDisplayString(_ctx.label),
        5
        /* TEXT, STYLE */
      )) : createCommentVNode("v-if", true),
      createElementVNode("input", {
        class: normalizeClass(["fan-input", [
          { "fan-input--disabled": _ctx.disabled },
          { "fan-input--unreal": _ctx.disabled || _ctx.readonly }
        ]]),
        type: _ctx.type,
        value: _ctx.innerValue,
        maxlength: _ctx.maxlength,
        readonly: _ctx.readonly,
        disabled: _ctx.disabled || _ctx.readonly,
        autofocus: _ctx.autofocus ? "autofocus" : "",
        style: normalizeStyle(_ctx.inStyle),
        placeholder: _ctx.placeholder,
        "placeholder-style": `color:${_ctx.placeholderColor};`,
        onBlur: _cache[0] || (_cache[0] = (...args) => _ctx.onBlur && _ctx.onBlur(...args)),
        onFocus: _cache[1] || (_cache[1] = (...args) => _ctx.onFocus && _ctx.onFocus(...args)),
        onInput: _cache[2] || (_cache[2] = (...args) => _ctx.handleInput && _ctx.handleInput(...args)),
        onChange: _cache[3] || (_cache[3] = ($event) => _ctx.handleChange("change")),
        onKeyup: _cache[4] || (_cache[4] = withKeys(($event) => _ctx.handleChange("confirm"), ["enter"])),
        onConfirm: _cache[5] || (_cache[5] = ($event) => _ctx.handleChange("confirm"))
      }, null, 46, _hoisted_1$f),
      _ctx.clearable && _ctx.innerValue && _ctx.focused ? (openBlock(), createBlock(_component_FanIcon, {
        key: 2,
        name: _ctx.clearIcon,
        color: _ctx.suffixColor,
        size: _ctx.suffixSize,
        onClick: _ctx.onClear
      }, null, 8, ["name", "color", "size", "onClick"])) : createCommentVNode("v-if", true),
      _ctx.suffixIcon ? (openBlock(), createBlock(_component_FanIcon, {
        key: 3,
        name: _ctx.suffixIcon,
        color: _ctx.suffixColor,
        size: _ctx.suffixSize,
        style: { "margin-right": "4px" }
      }, null, 8, ["name", "color", "size"])) : createCommentVNode("v-if", true)
    ],
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$k.render = __vue_render__$k;
var stdin_default$l = __vue_sfc__$k;
const Input = stdin_default$l;
const inputGridSfc = "";
const { env: runEnv } = getSystemInfo();
const __vue_sfc__$j = defineComponent({
  name: createNamespace("InputGrid")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["update:modelValue", "input"],
  props: {
    modelValue: {
      type: [String, Number],
      default: ""
    },
    // 输入内容长度
    length: {
      type: [String, Number],
      default: 6
    },
    type: {
      type: String,
      default: "text",
      validator: (value) => {
        return ["text", "number", "idcard", "tel"].includes(value);
      }
    },
    gridStyle: String,
    cursorColor: {
      type: String,
      default: "#1677FE"
    },
    // 输入完成时是否自动收起软键盘
    autoBlur: {
      type: Boolean,
      default: true
    }
  },
  setup(props, { emit }) {
    const innerValue = ref("");
    const focus = ref(false);
    const domRef = ref(null);
    const renderValues = computed(() => {
      const val = `${typeof innerValue.value === "undefined" ? "" : innerValue.value}`;
      const length = props.length;
      let index = -1;
      const chars = Array.from({ length }).map((_, i) => {
        const char = val[i] || "";
        if (char === "" && index === -1)
          index = i;
        return char;
      });
      if (val.length >= length)
        index = length - 1;
      return { chars, index };
    });
    const theStyle = computed(() => {
      return `--fan-grid-cursor-color:${props.cursorColor};`;
    });
    const gridInnerStyle = computed(() => transformStyleSize(props.gridStyle));
    watch(
      () => props.modelValue,
      (val) => {
        if (val !== innerValue.value)
          innerValue.value = val;
      },
      { immediate: true }
    );
    watch(
      innerValue,
      (val) => {
        if (val !== props.modelValue)
          emit("update:modelValue", val);
        emit("input", val);
      },
      { immediate: true }
    );
    const onFocus = () => {
      focus.value = true;
    };
    const onBlur = () => {
      focus.value = false;
    };
    const onInput = (e) => {
      const { length, type, autoBlur } = props;
      const innerValues = getInputValue(e);
      let val = String(innerValues);
      if (autoBlur && val.length >= length) {
        if (runEnv === "h5")
          domRef.value.input.blur();
        onBlur();
      }
      if (val.length > length)
        val = val.substring(0, length);
      if (val && (type === "number" || type === "tel")) {
        val = isNaN(+val) ? "" : +val;
      }
      if (val !== innerValue.value)
        innerValue.value = val;
    };
    const boxClick = () => {
      if (runEnv === "h5")
        domRef.value.input.focus();
      if (!focus.value)
        focus.value = true;
      else
        focus.value = focus.value === 1 ? true : 1;
    };
    return {
      theStyle,
      gridInnerStyle,
      renderValues,
      innerValue,
      focus,
      onFocus,
      onBlur,
      onInput,
      boxClick
    };
  }
});
const _hoisted_1$e = ["type", "value", "focus", "autofocus"];
function __vue_render__$j(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: "fan-grid-input",
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      createElementVNode("input", {
        ref: "input",
        class: "fan-grid-input__in",
        type: _ctx.type,
        value: _ctx.innerValue,
        focus: _ctx.focus,
        autofocus: _ctx.focus,
        onFocus: _cache[0] || (_cache[0] = (...args) => _ctx.onFocus && _ctx.onFocus(...args)),
        onBlur: _cache[1] || (_cache[1] = (...args) => _ctx.onBlur && _ctx.onBlur(...args)),
        onInput: _cache[2] || (_cache[2] = (...args) => _ctx.onInput && _ctx.onInput(...args))
      }, null, 40, _hoisted_1$e),
      createElementVNode("div", {
        class: "fan-flex",
        onClick: _cache[3] || (_cache[3] = (...args) => _ctx.boxClick && _ctx.boxClick(...args))
      }, [
        (openBlock(true), createElementBlock(
          Fragment,
          null,
          renderList(_ctx.renderValues.chars, (char, index) => {
            return openBlock(), createElementBlock(
              "div",
              {
                key: index,
                class: normalizeClass(["fan-grid-input__box", { cursor: _ctx.focus && index === _ctx.renderValues.index }]),
                style: normalizeStyle(_ctx.gridInnerStyle)
              },
              toDisplayString(char),
              7
              /* TEXT, CLASS, STYLE */
            );
          }),
          128
          /* KEYED_FRAGMENT */
        ))
      ])
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$j.render = __vue_render__$j;
var stdin_default$k = __vue_sfc__$j;
const InputGrid = stdin_default$k;
const inputNumberSfc = "";
function getInputType(integer) {
  return { type: "text", mode: integer ? "numeric" : "decimal" };
}
const __vue_sfc__$i = defineComponent({
  name: createNamespace("InputNumber")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K },
  props: {
    modelValue: {
      type: [Number, String]
    },
    // 是否只允许输入整数
    integer: {
      type: Boolean,
      default: true
    },
    // 计数器步长
    step: {
      type: Number,
      default: 1
    },
    // 按钮大小
    actionSize: {
      type: [Number, String],
      default: 22
    },
    // 按钮颜色
    actionColor: {
      type: String
    },
    inputWidth: {
      type: [Number, String],
      default: 32
    },
    inputStyle: String,
    min: {
      type: Number,
      default: 1
    },
    max: {
      type: Number,
      default: 99999
    },
    // 减少按钮图标名或网络地址，有值则覆盖默认按钮
    minusIcon: {
      type: String
    },
    // 增加按钮图标名或网络地址
    plusIcon: {
      type: String
    }
  },
  emits: ["update:modelValue", "input", "change", "overlimit"],
  setup(props, context) {
    const innerValue = ref(1);
    const inputType = computed(() => getInputType(props.integer));
    const actionStyle = computed(() => {
      const size = transformSize(props.actionSize);
      return `width:${size};height:${size};`;
    });
    const theInputStyle = computed(() => {
      const size = transformSize(props.actionSize);
      const width = transformSize(props.inputWidth);
      return `width:${width};height:${size};line-height:${size};${transformStyleSize(props.inputStyle)}`;
    });
    const minusDisabled = computed(() => innerValue.value <= props.min);
    const plusDisabled = computed(() => props.max && innerValue.value >= props.max);
    watch(
      () => props.modelValue,
      (val) => {
        if ((val || val === 0) && val !== innerValue.value)
          innerValue.value = val;
      },
      { immediate: true }
    );
    watch(innerValue, (val) => {
      if (val !== props.modelValue)
        context.emit("update:modelValue", val);
      context.emit("input", val);
      context.emit("change", val);
    });
    const onInput = (e) => {
      let value = Number(getInputValue(e)) || "";
      const { min, max } = props;
      if (!value || value < min) {
        value = min;
        context.emit("overlimit", "minus");
      } else if ((max || max === 0) && value > max) {
        value = max;
        context.emit("overlimit", "plus");
      }
      innerValue.value = value;
    };
    const minus = () => {
      const { step, min } = props;
      const val = innerValue.value - step;
      if (val < min) {
        if (step > 1)
          innerValue.value = min;
        else
          context.emit("overlimit", "minus");
      } else {
        innerValue.value = val;
      }
    };
    const plus = () => {
      const { step, max } = props;
      const val = innerValue.value + step;
      if ((max || max === 0) && val > max) {
        if (step > 1)
          innerValue.value = max;
        else
          context.emit("overlimit", "plus");
      } else {
        innerValue.value = val;
      }
    };
    return {
      innerValue,
      inputType,
      actionStyle,
      theInputStyle,
      minusDisabled,
      plusDisabled,
      onInput,
      minus,
      plus
    };
  }
});
const _hoisted_1$d = { class: "fan-input-num" };
const _hoisted_2$8 = ["type", "inputmode"];
function __vue_render__$i(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock("div", _hoisted_1$d, [
    createElementVNode(
      "button",
      {
        class: normalizeClass(["fan-flex fan-align-center fan-justify-center fan-input-num__action", { "fan-input-num--disabled": _ctx.minusDisabled }]),
        style: normalizeStyle(_ctx.actionStyle),
        onClick: _cache[0] || (_cache[0] = (...args) => _ctx.minus && _ctx.minus(...args))
      },
      [
        !_ctx.minusIcon ? (openBlock(), createElementBlock(
          "div",
          {
            key: 0,
            class: "fan-input-num__hl",
            style: normalizeStyle({ backgroundColor: _ctx.actionColor })
          },
          null,
          4
          /* STYLE */
        )) : (openBlock(), createBlock(_component_FanIcon, {
          key: 1,
          name: _ctx.minusIcon,
          size: _ctx.actionSize * 0.7,
          color: _ctx.actionColor
        }, null, 8, ["name", "size", "color"]))
      ],
      6
      /* CLASS, STYLE */
    ),
    withDirectives(createElementVNode("input", {
      class: "fan-input-num__field",
      style: normalizeStyle(_ctx.theInputStyle),
      controlled: "",
      "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => _ctx.innerValue = $event),
      type: _ctx.inputType.type,
      inputmode: _ctx.inputType.mode,
      onInput: _cache[2] || (_cache[2] = (...args) => _ctx.onInput && _ctx.onInput(...args))
    }, null, 44, _hoisted_2$8), [
      [vModelDynamic, _ctx.innerValue]
    ]),
    createElementVNode(
      "button",
      {
        class: normalizeClass(["fan-flex fan-align-center fan-justify-center fan-input-num__action", { "fan-input-num--disabled": _ctx.plusDisabled }]),
        style: normalizeStyle(_ctx.actionStyle),
        onClick: _cache[3] || (_cache[3] = (...args) => _ctx.plus && _ctx.plus(...args))
      },
      [
        !_ctx.plusIcon ? (openBlock(), createElementBlock(
          Fragment,
          { key: 0 },
          [
            createElementVNode(
              "div",
              {
                class: "fan-input-num__hl",
                style: normalizeStyle({ backgroundColor: _ctx.actionColor })
              },
              null,
              4
              /* STYLE */
            ),
            createElementVNode(
              "div",
              {
                class: "fan-input-num__vl",
                style: normalizeStyle({ backgroundColor: _ctx.actionColor })
              },
              null,
              4
              /* STYLE */
            )
          ],
          64
          /* STABLE_FRAGMENT */
        )) : (openBlock(), createBlock(_component_FanIcon, {
          key: 1,
          name: _ctx.plusIcon,
          size: _ctx.actionSize * 0.7,
          color: _ctx.actionColor
        }, null, 8, ["name", "size", "color"]))
      ],
      6
      /* CLASS, STYLE */
    )
  ]);
}
__vue_sfc__$i.render = __vue_render__$i;
var stdin_default$j = __vue_sfc__$i;
const InputNumber = stdin_default$j;
const Lazyload = FanLazyload;
const listSfc = "";
const __vue_sfc__$h = defineComponent({
  name: createNamespace("List")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanLoading: stdin_default$J },
  props: {
    /**
     * 是否处于隐藏状态，此时不触发触底
     */
    hidden: {
      type: Boolean,
      default: false
    },
    status: {
      type: String,
      default: "loading",
      validator: (value) => {
        return ["loading", "hasMore", "noMore", "error"].includes(value);
      }
    },
    loadingColor: String,
    loadingSize: {
      type: Number,
      default: 22
    },
    loadingText: {
      type: String,
      default: ""
    },
    textColor: {
      type: String,
      default: "#999"
    },
    noMoreText: {
      type: String,
      default: "没有更多了"
    },
    errorText: {
      type: String,
      default: "加载失败"
    }
  },
  emits: ["load", "errorClick"],
  setup(props, context) {
    const text = computed(() => {
      const { loadingText, noMoreText, errorText, status } = props;
      if (status === ListStatus.noMore)
        return noMoreText;
      if (status === ListStatus.error)
        return errorText;
      return loadingText;
    });
    const textSize = computed(() => {
      return `calc(${transformSize(props.loadingSize)} * 0.64)`;
    });
    const showLoading = computed(() => {
      return props.status === ListStatus.loading || props.status === ListStatus.hasMore;
    });
    const { onPageReachBottom } = usePageLifecycle();
    onPageReachBottom(() => {
      !props.hidden && context.emit("load");
    });
    const onErrorClick = () => {
      if (props.status !== ListStatus.error)
        return;
      context.emit("errorClick");
    };
    return { text, textSize, showLoading, onErrorClick };
  }
});
const _hoisted_1$c = { class: "fan-list" };
const _hoisted_2$7 = { class: "fan-list__loadt" };
function __vue_render__$h(_ctx, _cache) {
  const _component_FanLoading = resolveComponent("FanLoading");
  return openBlock(), createElementBlock("div", _hoisted_1$c, [
    renderSlot(_ctx.$slots, "default"),
    _ctx.showLoading || _ctx.text ? (openBlock(), createElementBlock(
      "div",
      {
        key: 0,
        onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onErrorClick && _ctx.onErrorClick(...args)),
        class: "fan-flex fan-align-center fan-justify-center fan-list__load",
        style: normalizeStyle({ fontSize: _ctx.textSize, color: _ctx.textColor })
      },
      [
        _ctx.showLoading ? (openBlock(), createBlock(_component_FanLoading, {
          key: 0,
          size: _ctx.loadingSize,
          color: _ctx.loadingColor
        }, null, 8, ["size", "color"])) : createCommentVNode("v-if", true),
        createElementVNode(
          "span",
          _hoisted_2$7,
          toDisplayString(_ctx.text),
          1
          /* TEXT */
        )
      ],
      4
      /* STYLE */
    )) : createCommentVNode("v-if", true)
  ]);
}
__vue_sfc__$h.render = __vue_render__$h;
var stdin_default$i = __vue_sfc__$h;
const List = stdin_default$i;
const Loading = stdin_default$J;
const loadingViewSfc = "";
const __vue_sfc__$g = defineComponent({
  name: createNamespace("LoadingView")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanLoading: stdin_default$J, FanIcon: stdin_default$K, FanButton: stdin_default$H },
  emits: ["buttonClick"],
  props: {
    customStyle: [String, Object],
    loading: Boolean,
    // string: message | object: { message, button }
    error: [String, Object],
    color: String,
    type: {
      type: String,
      default: "circle2"
    },
    // 用绝对定位撑满父盒子
    full: {
      type: Boolean,
      default: false
    }
  },
  setup(props, context) {
    const theStyle = computed(() => transformStyleSize(props.customStyle));
    const showLoading = ref(false);
    const errorInfo = computed(() => {
      const { error } = props;
      if (!error)
        return null;
      if (typeof error === "string")
        return { message: error };
      return error;
    });
    watch(
      () => props.loading,
      (val) => {
        if (!val) {
          showLoading.value = false;
          return;
        }
        setTimeout(() => {
          if (props.loading)
            showLoading.value = true;
        }, 300);
      },
      { immediate: true }
    );
    const onClick = (e) => {
      context.emit("buttonClick", e);
    };
    return { theStyle, showLoading, errorInfo, onClick };
  }
});
const _hoisted_1$b = { key: 0 };
const _hoisted_2$6 = {
  key: 0,
  class: "fan-loading-view__t"
};
function __vue_render__$g(_ctx, _cache) {
  const _component_FanLoading = resolveComponent("FanLoading");
  const _component_FanIcon = resolveComponent("FanIcon");
  const _component_FanButton = resolveComponent("FanButton");
  return _ctx.loading ? (openBlock(), createElementBlock(
    "div",
    {
      key: 0,
      class: normalizeClass(["fan-loading-view", { "fan-loading-view--full": _ctx.full }]),
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      !_ctx.errorInfo ? (openBlock(), createElementBlock("div", _hoisted_1$b, [
        _ctx.showLoading ? (openBlock(), createBlock(_component_FanLoading, {
          key: 0,
          color: _ctx.color,
          type: _ctx.type
        }, null, 8, ["color", "type"])) : createCommentVNode("v-if", true)
      ])) : (openBlock(), createElementBlock(
        Fragment,
        { key: 1 },
        [
          renderSlot(_ctx.$slots, "errorIcon", {}, () => [
            createVNode(_component_FanIcon, {
              name: "warning-circle-fill",
              size: 34,
              color: "var(--fan-danger-color)"
            })
          ]),
          _ctx.errorInfo.message ? (openBlock(), createElementBlock(
            "div",
            _hoisted_2$6,
            toDisplayString(_ctx.errorInfo.message),
            1
            /* TEXT */
          )) : createCommentVNode("v-if", true),
          _ctx.errorInfo.button ? (openBlock(), createBlock(_component_FanButton, {
            key: 1,
            round: "",
            bold: "",
            radius: "20px",
            style: { "min-width": "100px" },
            onClick: _ctx.onClick
          }, {
            default: withCtx(() => [
              createTextVNode(
                toDisplayString(_ctx.errorInfo.button),
                1
                /* TEXT */
              )
            ]),
            _: 1
            /* STABLE */
          }, 8, ["onClick"])) : createCommentVNode("v-if", true)
        ],
        64
        /* STABLE_FRAGMENT */
      ))
    ],
    6
    /* CLASS, STYLE */
  )) : (openBlock(), createElementBlock(
    "div",
    {
      key: 1,
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      renderSlot(_ctx.$slots, "default")
    ],
    4
    /* STYLE */
  ));
}
__vue_sfc__$g.render = __vue_render__$g;
var stdin_default$h = __vue_sfc__$g;
const LoadingView = stdin_default$h;
const navBarSfc = "";
const __vue_sfc__$f = defineComponent({
  name: createNamespace("NavBar")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K },
  props: {
    customStyle: [Object, String],
    /**
     * 导航栏背景，默认主题色-导航背景色
     */
    bg: String,
    /**
     * 导航文字颜色，默认主题色-前景色
     */
    fgColor: String,
    /**
     * 是否展示返回图标按钮
     */
    back: {
      type: Boolean,
      default: true
    },
    backIcon: {
      type: String,
      default: "left"
    },
    /**
     * 是否展示状态栏高度，状态栏相关设置仅对非H5生效
     */
    statusBar: {
      type: Boolean,
      default: true
    },
    statusBarColor: String,
    /**
     * 是否展示标题栏
     */
    titleBar: {
      type: Boolean,
      default: true
    },
    title: {
      type: String,
      default: ""
    },
    /**
     * 标题字体大小，默认16PX
     */
    textSize: [String, Number],
    /**
     * 标题栏高度，默认 utils.getSystemInfo()——navBarHeight-statusBarHeight + 'PX'
     */
    height: [String, Number],
    /**
     * 是否固定在顶部
     */
    fixed: {
      type: Boolean,
      default: true
    },
    /**
     * 固定在顶部时是否开启占位
     */
    placeholder: {
      type: Boolean,
      default: true
    },
    zIndex: {
      type: Number,
      default: 90
    },
    border: {
      type: Boolean,
      default: false
    }
  },
  emits: ["back"],
  setup(props, context) {
    const { navBarHeight, statusBarHeight } = getSystemInfo();
    const wrapperStyle = computed(() => {
      const { fgColor, height } = props;
      const titleHeight = !height ? navBarHeight - statusBarHeight + "px" : transformSize(height);
      let s = `--fan-title-bar-height:${titleHeight};--fan-status-bar-height:${statusBarHeight}px;`;
      if (fgColor)
        s += `--fan-nav-bar-fg-color:${fgColor};`;
      return s;
    });
    const theStyle = computed(() => {
      const { customStyle, bg, zIndex, textSize } = props;
      let s = `z-index:${zIndex};`;
      if (textSize)
        s += `font-size:${transformSize(textSize)};`;
      if (bg)
        s += `background:${bg};`;
      return transformStyleSize(customStyle) + s;
    });
    const statusBarStyle = computed(() => {
      return props.statusBarColor ? `background:${props.statusBarColor};` : "";
    });
    const placeholderStyle = computed(() => {
      const { statusBar, titleBar, fixed } = props;
      if (!fixed)
        return "";
      let h2 = "0";
      if (statusBar && titleBar)
        h2 = "calc(var(--fan-status-bar-height) + var(--fan-title-bar-height))";
      else if (statusBar)
        h2 = "var(--fan-status-bar-height)";
      else if (titleBar)
        h2 = "var(--fan-title-bar-height)";
      return `height:${h2};`;
    });
    const backClick = () => context.emit("back");
    return {
      wrapperStyle,
      theStyle,
      statusBarStyle,
      placeholderStyle,
      backClick
    };
  }
});
const _hoisted_1$a = {
  key: 1,
  class: "fan-nav-title-bar"
};
const _hoisted_2$5 = { class: "fan-nav-bar__l" };
const _hoisted_3$2 = {
  key: 0,
  class: "fan-ellipsis fan-nav-bar__title"
};
const _hoisted_4$2 = { class: "fan-nav-bar__r" };
function __vue_render__$f(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      class: "fan-nav-bar-wrap",
      style: normalizeStyle(_ctx.wrapperStyle)
    },
    [
      _ctx.fixed && _ctx.placeholder ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          style: normalizeStyle(_ctx.placeholderStyle),
          class: "fan-nav-bar__place"
        },
        null,
        4
        /* STYLE */
      )) : createCommentVNode("v-if", true),
      createElementVNode(
        "div",
        {
          style: normalizeStyle(_ctx.theStyle),
          class: normalizeClass(["fan-nav-bar", { "fan-nav-bar--fixed": _ctx.fixed, "fan-hairline--bottom": _ctx.border }])
        },
        [
          _ctx.statusBar ? (openBlock(), createElementBlock(
            "div",
            {
              key: 0,
              style: normalizeStyle(_ctx.statusBarStyle),
              class: "fan-nav-status-bar"
            },
            null,
            4
            /* STYLE */
          )) : createCommentVNode("v-if", true),
          _ctx.titleBar ? (openBlock(), createElementBlock("div", _hoisted_1$a, [
            createElementVNode("div", _hoisted_2$5, [
              _ctx.back ? (openBlock(), createBlock(_component_FanIcon, {
                key: 0,
                name: _ctx.backIcon,
                size: 18,
                "custom-style": "padding: 8px 16px",
                onClick: _ctx.backClick
              }, null, 8, ["name", "onClick"])) : createCommentVNode("v-if", true)
            ]),
            _ctx.title ? (openBlock(), createElementBlock(
              "div",
              _hoisted_3$2,
              toDisplayString(_ctx.title),
              1
              /* TEXT */
            )) : createCommentVNode("v-if", true),
            renderSlot(_ctx.$slots, "default"),
            createElementVNode("div", _hoisted_4$2, [
              renderSlot(_ctx.$slots, "right")
            ])
          ])) : createCommentVNode("v-if", true)
        ],
        6
        /* CLASS, STYLE */
      )
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$f.render = __vue_render__$f;
var stdin_default$g = __vue_sfc__$f;
const NavBar = stdin_default$g;
const noticeBarSfc = "";
var __async$3 = (__this, __arguments, generator) => {
  return new Promise((resolve, reject) => {
    var fulfilled = (value) => {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    };
    var rejected = (value) => {
      try {
        step(generator.throw(value));
      } catch (e) {
        reject(e);
      }
    };
    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
    step((generator = generator.apply(__this, __arguments)).next());
  });
};
const __vue_sfc__$e = defineComponent({
  name: createNamespace("NoticeBar")[0],
  components: { FanIcon: stdin_default$K },
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    text: String,
    speed: {
      type: [Number, String],
      default: 9
    },
    icon: String,
    iconSize: {
      type: [String, Number],
      default: 14
    },
    iconColor: {
      type: String
    },
    textSize: {
      type: [Number, String],
      default: 14
    },
    color: {
      type: String,
      default: "#f60"
    },
    bg: {
      type: String,
      default: "#fff7cc"
    },
    scrollable: {
      type: Boolean,
      default: true
    },
    multiline: {
      type: Boolean,
      default: false
    }
  },
  setup(props) {
    const txtWidth = ref(0);
    const boxWidth = ref(0);
    const style = ref("");
    const theStyle = computed({
      set: (val) => {
        if (val)
          style.value = transformStyleSize(val);
      },
      get: () => {
        const { color, bg, textSize } = props;
        let s = `color:${color};background:${bg};`;
        s += `font-size:${transformSize(textSize)};`;
        return s + style.value;
      }
    });
    const textBoxStyle = computed(() => {
      const { multiline, scrollable } = props;
      let { speed } = props;
      let s = `white-space:${!multiline ? "nowrap" : "normal"};`;
      if (!scrollable && !multiline) {
        return s += `width:100%;overflow:hidden;text-overflow:ellipsis;`;
      }
      if (multiline)
        return s;
      if (typeof speed === "string" && speed.includes("s")) {
        speed = speed.substring(0, speed.length - 1);
      }
      if ((scrollable || boxWidth.value <= txtWidth.value) && speed) {
        return s += `animation: wordsLoop ${speed}s linear infinite`;
      }
    });
    const theIconColor = computed(() => {
      const { icon, iconColor, color } = props;
      if (iconColor || !icon)
        return iconColor;
      return icon.includes("/") ? iconColor : color;
    });
    const _this = getCurrentInstance();
    const getWidth = () => __async$3(this, null, function* () {
      const rect = yield getElementBounding({ selector: ".fan-notice-bar__r", scope: _this });
      const rect1 = yield getElementBounding({ selector: ".fan-notice-bar__text", scope: _this });
      boxWidth.value = rect.width;
      txtWidth.value = rect1.width;
      theStyle.value = `--notice-bar-var:${rect.width}px;`;
    });
    onMounted(() => getWidth());
    return { theStyle, textBoxStyle, theIconColor };
  }
});
const _hoisted_1$9 = {
  key: 0,
  class: "fan-notice-bar__l"
};
const _hoisted_2$4 = { class: "fan-flex-1 fan-notice-bar__r" };
function __vue_render__$e(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      class: "fan-flex fan-align-start fan-notice-bar",
      style: normalizeStyle(_ctx.theStyle)
    },
    [
      _ctx.icon ? (openBlock(), createElementBlock("div", _hoisted_1$9, [
        createVNode(_component_FanIcon, {
          name: _ctx.icon,
          color: _ctx.theIconColor,
          size: _ctx.iconSize,
          style: { "vertical-align": "middle" }
        }, null, 8, ["name", "color", "size"])
      ])) : createCommentVNode("v-if", true),
      createElementVNode("div", _hoisted_2$4, [
        createElementVNode(
          "div",
          {
            class: "fan-notice-bar__text",
            style: normalizeStyle(_ctx.textBoxStyle)
          },
          toDisplayString(_ctx.text),
          5
          /* TEXT, STYLE */
        )
      ])
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$e.render = __vue_render__$e;
var stdin_default$f = __vue_sfc__$e;
const NoticeBar = stdin_default$f;
const Overlay = stdin_default$A;
const Picker = stdin_default$s;
const Popup = stdin_default$z;
const positionedViewSfc = "";
var __async$2 = (__this, __arguments, generator) => {
  return new Promise((resolve, reject) => {
    var fulfilled = (value) => {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    };
    var rejected = (value) => {
      try {
        step(generator.throw(value));
      } catch (e) {
        reject(e);
      }
    };
    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
    step((generator = generator.apply(__this, __arguments)).next());
  });
};
const __vue_sfc__$d = defineComponent({
  name: createNamespace("PositionedView")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    customStyle: [Object, String],
    /**
     * 文档定位方式，同 css 的 position
     */
    type: {
      type: String,
      default: "fixed",
      validator(value) {
        return ["fixed", "absolute", "relative", "static"].includes(value);
      }
    },
    /**
     * 位置的快捷选项，仅在top、bottom、left、right未设置时生效
     */
    position: {
      type: String,
      validator: (value) => ["bottom", "top"].includes(value)
    },
    zIndex: {
      type: [Number, String],
      default: 99
    },
    top: [String, Number],
    bottom: [String, Number],
    left: [String, Number],
    right: [String, Number],
    bg: String,
    // 底部安全区域
    safeBottom: {
      type: Boolean,
      default: false
    },
    /**
     * 是否在文档流中标签位置生成一个等高的占位元素
     */
    placeholder: {
      type: Boolean,
      default: false
    }
  },
  expose: ["calcHeight", "height"],
  setup(props) {
    const uniqueId = createUniqueId({ prefix: "fanPositionedView" });
    const height = ref(0);
    const theStyle = computed(() => {
      const {
        customStyle,
        type,
        left,
        right,
        top,
        bottom,
        zIndex,
        position,
        bg
      } = props;
      let s = `position:${type};z-index:${zIndex};`;
      if (!left && !right && !top && !bottom) {
        if (position === "bottom")
          s += `bottom:0;left:0;right:0;`;
        if (position === "top")
          s += `top:0;left:0;right:0;`;
      } else {
        left && (s += `left:${transformSize(left)};`);
        right && (s += `right:${transformSize(right)};`);
        top && (s += `top:${transformSize(top)};`);
        bottom && (s += `bottom:${transformSize(bottom)};`);
      }
      bg && (s += `background:${bg};`);
      return transformStyleSize(customStyle) + s;
    });
    const useSafeBottom = computed(() => {
      const { position, safeBottom } = props;
      if (safeBottom === false)
        return false;
      return safeBottom || position === "bottom";
    });
    const _this = getCurrentInstance();
    let num = 0;
    const calcHeight = () => __async$2(this, null, function* () {
      if (!props.placeholder) {
        height.value = 0;
        return;
      }
      const rect = yield getElementBounding({
        selector: "#" + uniqueId,
        scope: _this
      });
      num++;
      if (!(rect == null ? void 0 : rect.height) && num < 3) {
        setTimeout(calcHeight, 100);
        return;
      }
      height.value = (rect == null ? void 0 : rect.height) || 0;
    });
    onMounted(() => {
      setTimeout(calcHeight, 0);
    });
    watch(() => props.placeholder, calcHeight);
    return { uniqueId, height, theStyle, useSafeBottom, calcHeight };
  }
});
const _hoisted_1$8 = { class: "fan-positioned-view" };
const _hoisted_2$3 = ["id"];
function __vue_render__$d(_ctx, _cache) {
  return openBlock(), createElementBlock("div", _hoisted_1$8, [
    createElementVNode("div", {
      id: _ctx.uniqueId,
      class: normalizeClass(["fan-positioned-view__in", { "fan-positioned-view--safe": _ctx.useSafeBottom }]),
      style: normalizeStyle(_ctx.theStyle)
    }, [
      renderSlot(_ctx.$slots, "default")
    ], 14, _hoisted_2$3),
    _ctx.height ? (openBlock(), createElementBlock(
      "div",
      {
        key: 0,
        class: "fan-positioned-view__place",
        style: normalizeStyle({ height: _ctx.height + "px" })
      },
      null,
      4
      /* STYLE */
    )) : createCommentVNode("v-if", true)
  ]);
}
__vue_sfc__$d.render = __vue_render__$d;
var stdin_default$e = __vue_sfc__$d;
const PositionedView = stdin_default$e;
const priceSfc = "";
const __vue_sfc__$c = defineComponent({
  name: createNamespace("Price")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    value: [String, Number],
    // 价格 整数、小数 分开显示大小
    split: {
      type: Boolean,
      default: false
    },
    bold: [Boolean, Number, String],
    color: {
      type: String
      // default: '#FE3F19'
    },
    size: {
      type: [String, Number]
    },
    symbol: {
      type: String,
      default: "¥"
    },
    symbolPosition: {
      type: String,
      default: "left",
      validator: (value) => ["left", "right"].includes(value)
    },
    symbolStyle: [String, Object],
    // 较小项（符号symbol、split的小数位）的大小
    subSize: {
      type: [String, Number]
      // default: '0.67em'
    },
    // 符号与数字间距
    space: {
      type: [String, Number],
      default: "1px"
    },
    font: {
      type: Boolean,
      default: true
    }
  },
  setup(props) {
    const theStyle = computed(() => {
      const { color, size, bold } = props;
      let s = "";
      if (color)
        s += `color:${color};`;
      if (size)
        s += `font-size:${transformSize(size)};`;
      if (typeof bold === "number" || typeof bold === "string" && Number(bold) >= 100)
        s += `font-weight:${bold};`;
      return s;
    });
    const subFontSize = computed(() => transformSize(props.subSize));
    const theSymbolStyle = computed(() => {
      const { symbolStyle, symbolPosition, space } = props;
      const pad = transformSize(space);
      let s = symbolPosition === "right" ? `padding-left:${pad};` : `padding-right:${pad};`;
      if (subFontSize.value)
        s += `font-size:${subFontSize.value};`;
      return transformStyleSize(symbolStyle) + s;
    });
    const priceChars = computed(() => {
      let arr = ["", ""];
      const value = String(
        typeof props.value === "undefined" ? "" : props.value
      );
      if (props.split && value.includes(".")) {
        arr = value.split(".");
        arr[1] = `.${arr[1]}`;
      } else {
        arr[0] = value;
      }
      return arr;
    });
    return { theStyle, subFontSize, theSymbolStyle, priceChars };
  }
});
const _hoisted_1$7 = { class: "fan-price__val" };
function __vue_render__$c(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      style: normalizeStyle(_ctx.theStyle),
      class: normalizeClass(["fan-price", { "fan-price--bold": _ctx.bold, "fan-price--font": _ctx.font }])
    },
    [
      createCommentVNode(" 注意消除元素间间距 "),
      _ctx.symbol && _ctx.symbolPosition === "left" ? (openBlock(), createElementBlock(
        "span",
        {
          key: 0,
          class: "fan-price--s",
          style: normalizeStyle(_ctx.theSymbolStyle)
        },
        toDisplayString(_ctx.symbol),
        5
        /* TEXT, STYLE */
      )) : createCommentVNode("v-if", true),
      createElementVNode(
        "span",
        _hoisted_1$7,
        toDisplayString(_ctx.priceChars[0]),
        1
        /* TEXT */
      ),
      _ctx.priceChars[1] ? (openBlock(), createElementBlock(
        "span",
        {
          key: 1,
          class: "fan-price--s",
          style: normalizeStyle({ fontSize: _ctx.subFontSize })
        },
        toDisplayString(_ctx.priceChars[1]),
        5
        /* TEXT, STYLE */
      )) : createCommentVNode("v-if", true),
      _ctx.symbol && _ctx.symbolPosition === "right" ? (openBlock(), createElementBlock(
        "span",
        {
          key: 2,
          class: "fan-price--s",
          style: normalizeStyle(_ctx.theSymbolStyle)
        },
        toDisplayString(_ctx.symbol),
        5
        /* TEXT, STYLE */
      )) : createCommentVNode("v-if", true)
    ],
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$c.render = __vue_render__$c;
var stdin_default$d = __vue_sfc__$c;
const Price = stdin_default$d;
const pullRefreshSfc = "";
var __async$1 = (__this, __arguments, generator) => {
  return new Promise((resolve, reject) => {
    var fulfilled = (value) => {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    };
    var rejected = (value) => {
      try {
        step(generator.throw(value));
      } catch (e) {
        reject(e);
      }
    };
    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
    step((generator = generator.apply(__this, __arguments)).next());
  });
};
const __default__ = defineComponent({
  name: createNamespace("PullRefresh")[0],
  options: { virtualHost: true }
});
const __vue_sfc__$b = /* @__PURE__ */ Object.assign(__default__, {
  props: {
    pullingText: {
      type: String,
      default: "下拉即可刷新..."
    },
    loosingText: {
      type: String,
      default: "释放即可刷新..."
    },
    loadingText: {
      type: String,
      default: "加载中..."
    },
    successText: {
      type: String,
      default: "加载成功"
    },
    successDuration: {
      type: [Number, String],
      default: 500
    }
  },
  emits: ["refresh"],
  setup(__props, { expose: __expose, emit: __emit }) {
    __expose();
    const emit = __emit;
    const props = __props;
    const { onPageScroll } = usePageLifecycle();
    const state = reactive({
      status: "success",
      // loading pulling loosing success
      height: 50,
      top: 0,
      isTouch: false,
      isPullingGesture: false,
      start: 0,
      startY: 0,
      isTop: true
    });
    const statusTxt = computed(() => {
      let txt = "";
      if (state.status === "pulling") {
        txt = props.pullingText;
      } else if (state.status === "loosing") {
        txt = props.loosingText;
      } else if (state.status === "loading") {
        txt = props.loadingText;
      } else {
        txt = props.successText;
      }
      return txt;
    });
    const _this = getCurrentInstance();
    const getEl = (el) => __async$1(this, null, function* () {
      const ret = yield getElementBounding({
        selector: el,
        scope: _this
      });
      if (!ret)
        return {};
      return ret;
    });
    const ease = (move) => {
      move = move - state.start;
      if (move > state.height) {
        if (move < state.height * 2) {
          move = state.height + (move - state.height) / 2;
        } else {
          move = state.height * 1.5 + (move - state.height * 2) / 4;
        }
      }
      return Math.round(move);
    };
    const onTouchStart = (e) => __async$1(this, null, function* () {
      const { top } = yield getEl(".fan-pull-refresh__head");
      state.isTouch = true;
      state.start = e.touches[0].clientY;
      state.startY = top;
    });
    const onTouchMove = (e) => __async$1(this, null, function* () {
      if (!state.isTop && state.status === "success") {
        state.isPullingGesture = false;
        return;
      }
      const delta = e.touches[0].clientY - state.start;
      if (delta > 0) {
        state.isPullingGesture = true;
        const move = ease(e.touches[0].clientY);
        state.top = move > 0 ? move : 0;
        onScroll();
        e.stopPropagation();
      } else {
        state.isPullingGesture = false;
      }
    });
    const stopPullRefresh = () => {
      state.status = "success";
      setTimeout(() => {
        state.top = 0;
      }, Number(props.successDuration));
    };
    const onTouchEnd = () => {
      if (state.top >= state.height) {
        state.status = "loading";
        state.top = state.height;
        emit("refresh", stopPullRefresh);
      } else {
        state.top = 0;
      }
      state.isTouch = false;
      state.isPullingGesture = false;
    };
    const onScroll = () => {
      const move = Math.round(state.top - state.startY);
      if (move >= state.height) {
        state.status = "loosing";
      } else {
        state.status = "pulling";
      }
    };
    onPageScroll(({ scrollTop }) => {
      if (scrollTop > 0) {
        state.isTop = false;
      } else {
        state.isTop = true;
      }
    });
    const __returned__ = { emit, props, onPageScroll, state, statusTxt, _this, getEl, ease, onTouchStart, onTouchMove, stopPullRefresh, onTouchEnd, onScroll, defineComponent, get createNamespace() {
      return createNamespace;
    }, reactive, computed, getCurrentInstance, get getElementBounding() {
      return getElementBounding;
    }, get usePageLifecycle() {
      return usePageLifecycle;
    }, FanLoading: stdin_default$J };
    Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
    return __returned__;
  }
});
function __vue_render__$b(_ctx, _cache, $props, $setup, $data, $options) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: "fan-pull-refresh",
      style: normalizeStyle({
        touchAction: $setup.state.isPullingGesture ? "none" : "pan-y"
      }),
      onTouchstartPassive: $setup.onTouchStart,
      onTouchmovePassive: $setup.onTouchMove,
      onTouchend: $setup.onTouchEnd,
      onTouchcancel: $setup.onTouchEnd
    },
    [
      createElementVNode(
        "div",
        {
          class: "fan-pull-refresh__inner",
          style: normalizeStyle({
            transform: `translate3d(0, ${$setup.state.top}px, 0)`,
            transitionDuration: $setup.state.isTouch ? "0ms" : "300ms"
          })
        },
        [
          createElementVNode(
            "div",
            {
              class: "fan-pull-refresh__head fan-flex-center",
              style: normalizeStyle({ height: `${$setup.state.height}px` })
            },
            [
              $setup.state.status === "loading" ? renderSlot(_ctx.$slots, "loading", { key: 0 }, () => [
                createVNode($setup["FanLoading"], {
                  size: "16",
                  style: { "margin-right": "6px" }
                }),
                createTextVNode(
                  " " + toDisplayString($setup.statusTxt),
                  1
                  /* TEXT */
                )
              ]) : $setup.state.status === "pulling" ? renderSlot(_ctx.$slots, "pulling", { key: 1 }, () => [
                createTextVNode(
                  toDisplayString($setup.statusTxt),
                  1
                  /* TEXT */
                )
              ]) : $setup.state.status === "loosing" ? renderSlot(_ctx.$slots, "loosing", { key: 2 }, () => [
                createTextVNode(
                  toDisplayString($setup.statusTxt),
                  1
                  /* TEXT */
                )
              ]) : renderSlot(_ctx.$slots, "success", { key: 3 }, () => [
                createTextVNode(
                  toDisplayString($setup.statusTxt),
                  1
                  /* TEXT */
                )
              ])
            ],
            4
            /* STYLE */
          ),
          renderSlot(_ctx.$slots, "default")
        ],
        4
        /* STYLE */
      )
    ],
    36
    /* STYLE, NEED_HYDRATION */
  );
}
__vue_sfc__$b.render = __vue_render__$b;
var stdin_default$c = __vue_sfc__$b;
const PullRefresh = stdin_default$c;
const rateSfc = "";
const __vue_sfc__$a = defineComponent({
  name: createNamespace("Rate")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K },
  props: {
    // 当前评分
    modelValue: {
      type: [Number, String],
      default: 1
    },
    // 图标名称
    icon: {
      type: String,
      default: "star-fill"
    },
    // 星星未选中的颜色
    color: {
      type: String,
      default: "#ececec"
    },
    // 星星选中状态颜色
    activeColor: {
      type: String,
      default: "#ffca3e"
    },
    // 星星禁用状态颜色
    disabledColor: {
      type: String,
      default: "#c0c0c0"
    },
    // 星星的大小
    size: {
      type: [Number, String],
      default: 24
    },
    // 图标总数
    count: {
      type: [Number, String],
      default: 5
    },
    // 星星的间距
    space: [String, Number],
    // 是否可点击
    disabled: {
      type: Boolean,
      default: false
    },
    // 是否只读
    readonly: {
      type: [Boolean, String],
      default: true
    },
    // 是否显示半星
    allowHalf: {
      type: [Boolean, String],
      default: false
    },
    // todo: 是否支持滑动手势
    touchable: {
      type: [Boolean, String],
      default: false
    }
  },
  emits: ["update:modelValue", "change"],
  setup(props, context) {
    const theStyle = computed(() => {
      const { space } = props;
      const s = space ? `--fan-rate-space:${transformSize(space)};` : "";
      return s;
    });
    const value = ref(0);
    watch(
      () => props.modelValue,
      (val) => {
        const n = Number(val) || 0;
        if (value.value === n)
          return;
        value.value = n;
      },
      { immediate: true }
    );
    watch(value, (val) => {
      if (val === props.modelValue)
        return;
      context.emit("update:modelValue", val);
      context.emit("change", val);
    });
    const stars = computed(() => {
      const val = value.value;
      const list = [];
      const floorValue = Math.floor(val);
      const ceilValue = Math.ceil(val);
      for (let i = 0; i < props.count; i++) {
        let activeWidth = "0";
        if (floorValue > i) {
          activeWidth = "100%";
        } else if (ceilValue - 1 === i) {
          activeWidth = (val - floorValue) * 100 + "%";
        }
        list.push({ activeWidth });
      }
      return list;
    });
    return { theStyle, stars };
  }
});
function __vue_render__$a(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      style: normalizeStyle(_ctx.theStyle),
      class: "fan-rate"
    },
    [
      (openBlock(true), createElementBlock(
        Fragment,
        null,
        renderList(_ctx.stars, (star, index) => {
          return openBlock(), createElementBlock("div", {
            key: index,
            class: "fan-rate__icon"
          }, [
            createVNode(_component_FanIcon, {
              color: _ctx.color,
              size: _ctx.size,
              name: _ctx.icon
            }, null, 8, ["color", "size", "name"]),
            createCommentVNode(" #ifndef APP-NVUE "),
            createElementVNode(
              "div",
              {
                style: normalizeStyle({ width: star.activeWidth }),
                class: "fan-rate__icon-on"
              },
              [
                createVNode(_component_FanIcon, {
                  color: _ctx.disabled ? _ctx.disabledColor : _ctx.activeColor,
                  size: _ctx.size,
                  name: _ctx.icon
                }, null, 8, ["color", "size", "name"])
              ],
              4
              /* STYLE */
            ),
            createCommentVNode(" #endif ")
          ]);
        }),
        128
        /* KEYED_FRAGMENT */
      ))
    ],
    4
    /* STYLE */
  );
}
__vue_sfc__$a.render = __vue_render__$a;
var stdin_default$b = __vue_sfc__$a;
const Rate = stdin_default$b;
const richTextSfc = "";
const __vue_sfc__$9 = defineComponent({
  name: createNamespace("RichText")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    // html 字符串
    content: String
  },
  setup(props) {
    const isHtml = computed(() => {
      const reg = /<[^>]+>/g;
      return reg.test(props.content || "");
    });
    return { isHtml };
  }
});
const _hoisted_1$6 = ["innerHTML"];
function __vue_render__$9(_ctx, _cache) {
  return openBlock(), createElementBlock("div", {
    class: normalizeClass(["fan-rich-text", { pre: !_ctx.isHtml }]),
    innerHTML: _ctx.content
  }, null, 10, _hoisted_1$6);
}
__vue_sfc__$9.render = __vue_render__$9;
var stdin_default$a = __vue_sfc__$9;
const RichText = stdin_default$a;
const ScrollView = stdin_default$q;
const searchSfc = "";
const __vue_sfc__$8 = defineComponent({
  name: createNamespace("Search")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K, FanButton: stdin_default$H, FanInput: stdin_default$l },
  emits: ["blur", "focus", "click", "search", "input", "update:modelValue"],
  props: {
    modelValue: {
      type: String,
      default: ""
    },
    placeholder: String,
    prefixIcon: Boolean,
    readonly: {
      type: Boolean,
      default: false
    },
    bg: String,
    autofocus: Boolean,
    radius: {
      type: String,
      default: "20px"
    },
    icon: String,
    iconStyle: [String, Object],
    innerStyle: String,
    btnStyle: [String, Object]
  },
  setup(props, { emit }) {
    const inputBoxStyle = computed(() => {
      const { bg, radius, innerStyle } = props;
      let style = "";
      if (bg)
        style += `background-color:${bg};`;
      if (radius)
        style += `border-radius:${transformSize(radius)};`;
      return transformStyleSize(style) + transformStyleSize(innerStyle);
    });
    const innerValue = ref(props.modelValue);
    watch(innerValue, (val) => {
      if (val !== props.modelValue) {
        emit("update:modelValue", innerValue.value);
        emit("input", val);
      }
    });
    watch(
      () => props.modelValue,
      (val) => {
        if (val !== innerValue.value)
          innerValue.value = val;
      }
    );
    const onBlur = (e) => emit("blur", e);
    const onFocus = (e) => emit("focus", e);
    const onInput = (val) => emit("input", val);
    const onConfirm = (val) => emit("search", val);
    const onClick = (e) => emit("click", e);
    return {
      inputBoxStyle,
      innerValue,
      onBlur,
      onFocus,
      onInput,
      onClick,
      onConfirm
    };
  }
});
const _hoisted_1$5 = { class: "fan-search" };
function __vue_render__$8(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  const _component_FanInput = resolveComponent("FanInput");
  const _component_FanButton = resolveComponent("FanButton");
  return openBlock(), createElementBlock("div", _hoisted_1$5, [
    createElementVNode(
      "div",
      {
        onClick: _cache[3] || (_cache[3] = (...args) => _ctx.onClick && _ctx.onClick(...args)),
        class: "fan-search__inner",
        style: normalizeStyle(_ctx.inputBoxStyle)
      },
      [
        _ctx.prefixIcon ? (openBlock(), createBlock(_component_FanIcon, {
          key: 0,
          name: "search",
          color: "#999",
          size: 14,
          style: { marginRight: "3px" }
        })) : createCommentVNode("v-if", true),
        createVNode(_component_FanInput, {
          modelValue: _ctx.innerValue,
          "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.innerValue = $event),
          class: "fan-flex-1",
          style: { padding: "0 4px 0 0" },
          placeholder: _ctx.placeholder || "搜一搜",
          readonly: _ctx.readonly,
          autofocus: _ctx.autofocus,
          clearable: "",
          onBlur: _ctx.onBlur,
          onFocus: _ctx.onFocus,
          onInput: _ctx.onInput,
          onConfirm: _ctx.onConfirm
        }, null, 8, ["modelValue", "placeholder", "readonly", "autofocus", "onBlur", "onFocus", "onInput", "onConfirm"]),
        _ctx.icon ? (openBlock(), createBlock(_component_FanIcon, {
          key: 1,
          name: _ctx.icon,
          style: normalizeStyle(_ctx.iconStyle),
          onClick: _cache[1] || (_cache[1] = ($event) => _ctx.onConfirm(_ctx.innerValue))
        }, null, 8, ["name", "style"])) : (openBlock(), createBlock(_component_FanButton, {
          key: 2,
          round: "",
          radius: _ctx.radius,
          width: "70px",
          height: "100%",
          style: normalizeStyle(_ctx.btnStyle),
          onClick: _cache[2] || (_cache[2] = ($event) => _ctx.onConfirm(_ctx.innerValue))
        }, {
          default: withCtx(() => _cache[4] || (_cache[4] = [
            createTextVNode("搜索")
          ])),
          _: 1
          /* STABLE */
        }, 8, ["radius", "style"]))
      ],
      4
      /* STYLE */
    )
  ]);
}
__vue_sfc__$8.render = __vue_render__$8;
var stdin_default$9 = __vue_sfc__$8;
const Search = stdin_default$9;
const stickySfc = "";
const __vue_sfc__$7 = defineComponent({
  name: createNamespace("Sticky")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  props: {
    customStyle: [Object, String],
    offsetTop: {
      type: Number,
      default: 0
    },
    zIndex: {
      type: Number,
      default: 99
    },
    /**
     * 一个函数，返回容器对应的 NodesRef 节点，
     * 使用处可以通过 utils.getElementNodes 获取并传入
     */
    container: {
      type: Function
    },
    /**
     * 当前滚动区域的滚动位置，非 null 时会禁用页面滚动事件的监听
     */
    scrollTop: {
      type: Number,
      default: null
    }
  },
  emits: ["change"],
  setup(props, context) {
    const state = reactive({
      width: 0,
      height: 0,
      fixed: false,
      transform: 0
    });
    const uniqueId = createUniqueId({ prefix: "fanSticky" });
    const _this = getCurrentInstance();
    const { onPageScroll } = usePageLifecycle();
    const selector = "#" + uniqueId;
    const onScroll = () => {
      const { container, offsetTop } = props;
      if (typeof container === "function") {
        Promise.all([
          getElementBounding({ selector, scope: _this }),
          getElementBounding({ el: container() })
        ]).then(([rect, containerRect]) => {
          state.height = rect.height;
          state.width = rect.width;
          state.fixed = offsetTop > rect.top && containerRect.bottom > 0;
          const difference = containerRect.bottom - offsetTop - state.height;
          state.transform = difference < 0 ? difference : 0;
        });
        return;
      }
      getElementBounding({ selector, scope: _this }).then((rect) => {
        if (!rect)
          return;
        if (offsetTop >= rect.top) {
          state.fixed = true;
          state.height = rect.height;
          state.width = rect.width;
        } else {
          state.fixed = false;
        }
      });
    };
    onPageScroll((scrollTop) => {
      if (props.scrollTop != null)
        return;
      onScroll();
    });
    watch(
      () => props.scrollTop,
      (val) => val !== null && onScroll(),
      { immediate: true }
    );
    watch(
      () => state.fixed,
      (val) => {
        context.emit("change", { fixed: val });
      }
    );
    const wrapperStyle = computed(() => {
      if (!state.fixed)
        return "";
      return `width:${state.width}px;height:${state.height}px;`;
    });
    const theStyle = computed(() => {
      let s = "";
      if (state.transform)
        s += `transform:translate3d(0,${state.transform}px,0);`;
      if (!state.fixed)
        return s;
      const { offsetTop, zIndex } = props;
      s += `width:${state.width}px;height:${state.height}px;top:${offsetTop + "px"};z-index:${zIndex};${transformStyleSize(props.customStyle)}`;
      return s;
    });
    return { uniqueId, state, wrapperStyle, theStyle };
  }
});
const _hoisted_1$4 = ["id"];
function __vue_render__$7(_ctx, _cache) {
  return openBlock(), createElementBlock("div", {
    id: _ctx.uniqueId,
    style: normalizeStyle(_ctx.wrapperStyle)
  }, [
    createElementVNode(
      "div",
      {
        style: normalizeStyle(_ctx.theStyle),
        class: normalizeClass(["fan-sticky", { "fan-sticky--fixed": _ctx.state.fixed }])
      },
      [
        renderSlot(_ctx.$slots, "default")
      ],
      6
      /* CLASS, STYLE */
    )
  ], 12, _hoisted_1$4);
}
__vue_sfc__$7.render = __vue_render__$7;
var stdin_default$8 = __vue_sfc__$7;
const Sticky = stdin_default$8;
const swiperSfc = "";
const swiperProps = {
  customStyle: [String, Object],
  current: {
    type: Number,
    default: 0
  },
  // 切换的动画时间
  duration: {
    type: Number,
    default: 300
  },
  aspectRatio: {
    type: [Number, String],
    default: 2.7
  },
  list: {
    type: Array,
    default: () => []
    // [{ cover: string, ... }]
  },
  loop: Boolean,
  autoplay: {
    type: Number,
    default: 3500
  },
  // 风格，1-常规，2-一屏3个，左右露出相邻 item 的小部分
  type: {
    type: Number,
    default: 1
  },
  /**
   * 仅小程序有用
   */
  showMenuByLongpress: {
    type: Boolean,
    default: false
  },
  innerRadius: [String, Number],
  // 是否显示指示器
  indicator: {
    type: Boolean,
    default: true
  },
  // 当前选中的指示点颜色
  indicatorActiveColor: {
    type: String,
    default: "var(--fan-primary-color)"
  },
  // 支付宝小程序无法通过 slots.default 自动判断，此时需要该属性 https://ask.dcloud.net.cn/question/136765
  // 是否自定义 item 模板，即使用插槽
  customItem: {
    type: Boolean,
    default: false
  },
  autoHeight: {
    type: Boolean,
    default: false
  },
  //开启纵向滑动
  vertical: {
    type: Boolean,
    default: false
  }
};
const swiperEmits = ["click", "update:current", "change"];
const useSwiperState = (props) => {
  const swiperWidth = ref(375);
  const swiperAspectRatio = computed(() => {
    const { type, aspectRatio, autoHeight } = props;
    if (autoHeight)
      return 0;
    const ar = resolveAspectRatio(aspectRatio);
    if (type !== 2)
      return ar;
    const w = swiperWidth.value;
    return w / ((w - 76) / ar);
  });
  return { swiperWidth, swiperAspectRatio };
};
function isObject(o) {
  return typeof o === "object" && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === "Object";
}
function extend(target, src) {
  const noExtend = ["__proto__", "constructor", "prototype"];
  Object.keys(src).filter((key) => noExtend.indexOf(key) < 0).forEach((key) => {
    if (typeof target[key] === "undefined")
      target[key] = src[key];
    else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {
      if (src[key].__swiper__)
        target[key] = src[key];
      else
        extend(target[key], src[key]);
    } else {
      target[key] = src[key];
    }
  });
}
function needsNavigation(params = {}) {
  return params.navigation && typeof params.navigation.nextEl === "undefined" && typeof params.navigation.prevEl === "undefined";
}
function needsPagination(params = {}) {
  return params.pagination && typeof params.pagination.el === "undefined";
}
function needsScrollbar(params = {}) {
  return params.scrollbar && typeof params.scrollbar.el === "undefined";
}
function uniqueClasses(classNames = "") {
  const classes = classNames.split(" ").map((c) => c.trim()).filter((c) => !!c);
  const unique = [];
  classes.forEach((c) => {
    if (unique.indexOf(c) < 0)
      unique.push(c);
  });
  return unique.join(" ");
}
function wrapperClass(className = "") {
  if (!className)
    return "swiper-wrapper";
  if (!className.includes("swiper-wrapper"))
    return `swiper-wrapper ${className}`;
  return className;
}
const paramsList = [
  "eventsPrefix",
  "injectStyles",
  "injectStylesUrls",
  "modules",
  "init",
  "_direction",
  "oneWayMovement",
  "touchEventsTarget",
  "initialSlide",
  "_speed",
  "cssMode",
  "updateOnWindowResize",
  "resizeObserver",
  "nested",
  "focusableElements",
  "_enabled",
  "_width",
  "_height",
  "preventInteractionOnTransition",
  "userAgent",
  "url",
  "_edgeSwipeDetection",
  "_edgeSwipeThreshold",
  "_freeMode",
  "_autoHeight",
  "setWrapperSize",
  "virtualTranslate",
  "_effect",
  "breakpoints",
  "_spaceBetween",
  "_slidesPerView",
  "maxBackfaceHiddenSlides",
  "_grid",
  "_slidesPerGroup",
  "_slidesPerGroupSkip",
  "_slidesPerGroupAuto",
  "_centeredSlides",
  "_centeredSlidesBounds",
  "_slidesOffsetBefore",
  "_slidesOffsetAfter",
  "normalizeSlideIndex",
  "_centerInsufficientSlides",
  "_watchOverflow",
  "roundLengths",
  "touchRatio",
  "touchAngle",
  "simulateTouch",
  "_shortSwipes",
  "_longSwipes",
  "longSwipesRatio",
  "longSwipesMs",
  "_followFinger",
  "allowTouchMove",
  "_threshold",
  "touchMoveStopPropagation",
  "touchStartPreventDefault",
  "touchStartForcePreventDefault",
  "touchReleaseOnEdges",
  "uniqueNavElements",
  "_resistance",
  "_resistanceRatio",
  "_watchSlidesProgress",
  "_grabCursor",
  "preventClicks",
  "preventClicksPropagation",
  "_slideToClickedSlide",
  "_loop",
  "loopedSlides",
  "loopPreventsSliding",
  "_rewind",
  "_allowSlidePrev",
  "_allowSlideNext",
  "_swipeHandler",
  "_noSwiping",
  "noSwipingClass",
  "noSwipingSelector",
  "passiveListeners",
  "containerModifierClass",
  "slideClass",
  "slideActiveClass",
  "slideVisibleClass",
  "slideNextClass",
  "slidePrevClass",
  "wrapperClass",
  "lazyPreloaderClass",
  "lazyPreloadPrevNext",
  "runCallbacksOnInit",
  "observer",
  "observeParents",
  "observeSlideChildren",
  // modules
  "a11y",
  "_autoplay",
  "_controller",
  "coverflowEffect",
  "cubeEffect",
  "fadeEffect",
  "flipEffect",
  "creativeEffect",
  "cardsEffect",
  "hashNavigation",
  "history",
  "keyboard",
  "mousewheel",
  "_navigation",
  "_pagination",
  "parallax",
  "_scrollbar",
  "_thumbs",
  "virtual",
  "zoom",
  "control"
];
function getParams(obj = {}, splitEvents = true) {
  const params = {
    on: {}
  };
  const events = {};
  const passedParams = {};
  extend(params, Swiper$2.defaults);
  extend(params, Swiper$2.extendedDefaults);
  params._emitClasses = true;
  params.init = false;
  const rest = {};
  const allowedParams = paramsList.map((key) => key.replace(/_/, ""));
  const plainObj = Object.assign({}, obj);
  Object.keys(plainObj).forEach((key) => {
    if (typeof obj[key] === "undefined")
      return;
    if (allowedParams.indexOf(key) >= 0) {
      if (isObject(obj[key])) {
        params[key] = {};
        passedParams[key] = {};
        extend(params[key], obj[key]);
        extend(passedParams[key], obj[key]);
      } else {
        params[key] = obj[key];
        passedParams[key] = obj[key];
      }
    } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === "function") {
      if (splitEvents) {
        events[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];
      } else {
        params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];
      }
    } else {
      rest[key] = obj[key];
    }
  });
  ["navigation", "pagination", "scrollbar"].forEach((key) => {
    if (params[key] === true)
      params[key] = {};
    if (params[key] === false)
      delete params[key];
  });
  return {
    params,
    passedParams,
    rest,
    events
  };
}
function mountSwiper({
  el,
  nextEl,
  prevEl,
  paginationEl,
  scrollbarEl,
  swiper
}, swiperParams) {
  if (needsNavigation(swiperParams) && nextEl && prevEl) {
    swiper.params.navigation.nextEl = nextEl;
    swiper.originalParams.navigation.nextEl = nextEl;
    swiper.params.navigation.prevEl = prevEl;
    swiper.originalParams.navigation.prevEl = prevEl;
  }
  if (needsPagination(swiperParams) && paginationEl) {
    swiper.params.pagination.el = paginationEl;
    swiper.originalParams.pagination.el = paginationEl;
  }
  if (needsScrollbar(swiperParams) && scrollbarEl) {
    swiper.params.scrollbar.el = scrollbarEl;
    swiper.originalParams.scrollbar.el = scrollbarEl;
  }
  swiper.init(el);
}
function getChangedParams(swiperParams, oldParams, children, oldChildren, getKey) {
  const keys = [];
  if (!oldParams)
    return keys;
  const addKey = (key) => {
    if (keys.indexOf(key) < 0)
      keys.push(key);
  };
  if (children && oldChildren) {
    const oldChildrenKeys = oldChildren.map(getKey);
    const childrenKeys = children.map(getKey);
    if (oldChildrenKeys.join("") !== childrenKeys.join(""))
      addKey("children");
    if (oldChildren.length !== children.length)
      addKey("children");
  }
  const watchParams = paramsList.filter((key) => key[0] === "_").map((key) => key.replace(/_/, ""));
  watchParams.forEach((key) => {
    if (key in swiperParams && key in oldParams) {
      if (isObject(swiperParams[key]) && isObject(oldParams[key])) {
        const newKeys = Object.keys(swiperParams[key]);
        const oldKeys = Object.keys(oldParams[key]);
        if (newKeys.length !== oldKeys.length) {
          addKey(key);
        } else {
          newKeys.forEach((newKey) => {
            if (swiperParams[key][newKey] !== oldParams[key][newKey]) {
              addKey(key);
            }
          });
          oldKeys.forEach((oldKey) => {
            if (swiperParams[key][oldKey] !== oldParams[key][oldKey])
              addKey(key);
          });
        }
      } else if (swiperParams[key] !== oldParams[key]) {
        addKey(key);
      }
    }
  });
  return keys;
}
function getChildren(originalSlots, slidesRef, oldSlidesRef) {
  if (originalSlots === void 0) {
    originalSlots = {};
  }
  const slides = [];
  const slots = {
    "container-start": [],
    "container-end": [],
    "wrapper-start": [],
    "wrapper-end": []
  };
  const getSlidesFromElements = (els, slotName) => {
    if (!Array.isArray(els)) {
      return;
    }
    els.forEach((vnode) => {
      const isFragment = typeof vnode.type === "symbol";
      if (slotName === "default")
        slotName = "container-end";
      if (isFragment && vnode.children) {
        getSlidesFromElements(vnode.children, slotName);
      } else if (vnode.type && (vnode.type.name === "SwiperSlide" || vnode.type.name === "AsyncComponentWrapper")) {
        slides.push(vnode);
      } else if (slots[slotName]) {
        slots[slotName].push(vnode);
      }
    });
  };
  Object.keys(originalSlots).forEach((slotName) => {
    if (typeof originalSlots[slotName] !== "function")
      return;
    const els = originalSlots[slotName]();
    getSlidesFromElements(els, slotName);
  });
  oldSlidesRef.value = slidesRef.value;
  slidesRef.value = slides;
  return {
    slides,
    slots
  };
}
function updateSwiper({
  swiper,
  slides,
  passedParams,
  changedParams,
  nextEl,
  prevEl,
  scrollbarEl,
  paginationEl
}) {
  const updateParams = changedParams.filter((key) => key !== "children" && key !== "direction" && key !== "wrapperClass");
  const {
    params: currentParams,
    pagination,
    navigation,
    scrollbar,
    virtual,
    thumbs
  } = swiper;
  let needThumbsInit;
  let needControllerInit;
  let needPaginationInit;
  let needScrollbarInit;
  let needNavigationInit;
  let loopNeedDestroy;
  let loopNeedEnable;
  let loopNeedReloop;
  if (changedParams.includes("thumbs") && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) {
    needThumbsInit = true;
  }
  if (changedParams.includes("controller") && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) {
    needControllerInit = true;
  }
  if (changedParams.includes("pagination") && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) {
    needPaginationInit = true;
  }
  if (changedParams.includes("scrollbar") && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) {
    needScrollbarInit = true;
  }
  if (changedParams.includes("navigation") && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) {
    needNavigationInit = true;
  }
  const destroyModule = (mod) => {
    if (!swiper[mod])
      return;
    swiper[mod].destroy();
    if (mod === "navigation") {
      if (swiper.isElement) {
        swiper[mod].prevEl.remove();
        swiper[mod].nextEl.remove();
      }
      currentParams[mod].prevEl = void 0;
      currentParams[mod].nextEl = void 0;
      swiper[mod].prevEl = void 0;
      swiper[mod].nextEl = void 0;
    } else {
      if (swiper.isElement) {
        swiper[mod].el.remove();
      }
      currentParams[mod].el = void 0;
      swiper[mod].el = void 0;
    }
  };
  if (changedParams.includes("loop") && swiper.isElement) {
    if (currentParams.loop && !passedParams.loop) {
      loopNeedDestroy = true;
    } else if (!currentParams.loop && passedParams.loop) {
      loopNeedEnable = true;
    } else {
      loopNeedReloop = true;
    }
  }
  updateParams.forEach((key) => {
    if (isObject(currentParams[key]) && isObject(passedParams[key])) {
      extend(currentParams[key], passedParams[key]);
      if ((key === "navigation" || key === "pagination" || key === "scrollbar") && "enabled" in passedParams[key] && !passedParams[key].enabled) {
        destroyModule(key);
      }
    } else {
      const newValue = passedParams[key];
      if ((newValue === true || newValue === false) && (key === "navigation" || key === "pagination" || key === "scrollbar")) {
        if (newValue === false) {
          destroyModule(key);
        }
      } else {
        currentParams[key] = passedParams[key];
      }
    }
  });
  if (updateParams.includes("controller") && !needControllerInit && swiper.controller && swiper.controller.control && currentParams.controller && currentParams.controller.control) {
    swiper.controller.control = currentParams.controller.control;
  }
  if (changedParams.includes("children") && slides && virtual && currentParams.virtual.enabled) {
    virtual.slides = slides;
    virtual.update(true);
  }
  if (changedParams.includes("children") && slides && currentParams.loop) {
    loopNeedReloop = true;
  }
  if (needThumbsInit) {
    const initialized = thumbs.init();
    if (initialized)
      thumbs.update(true);
  }
  if (needControllerInit) {
    swiper.controller.control = currentParams.controller.control;
  }
  if (needPaginationInit) {
    if (swiper.isElement && (!paginationEl || typeof paginationEl === "string")) {
      paginationEl = document.createElement("div");
      paginationEl.classList.add("swiper-pagination");
      swiper.el.shadowEl.appendChild(paginationEl);
    }
    if (paginationEl)
      currentParams.pagination.el = paginationEl;
    pagination.init();
    pagination.render();
    pagination.update();
  }
  if (needScrollbarInit) {
    if (swiper.isElement && (!scrollbarEl || typeof scrollbarEl === "string")) {
      scrollbarEl = document.createElement("div");
      scrollbarEl.classList.add("swiper-scrollbar");
      swiper.el.shadowEl.appendChild(scrollbarEl);
    }
    if (scrollbarEl)
      currentParams.scrollbar.el = scrollbarEl;
    scrollbar.init();
    scrollbar.updateSize();
    scrollbar.setTranslate();
  }
  if (needNavigationInit) {
    if (swiper.isElement) {
      if (!nextEl || typeof nextEl === "string") {
        nextEl = document.createElement("div");
        nextEl.classList.add("swiper-button-next");
        swiper.el.shadowEl.appendChild(nextEl);
      }
      if (!prevEl || typeof prevEl === "string") {
        prevEl = document.createElement("div");
        prevEl.classList.add("swiper-button-prev");
        swiper.el.shadowEl.appendChild(prevEl);
      }
    }
    if (nextEl)
      currentParams.navigation.nextEl = nextEl;
    if (prevEl)
      currentParams.navigation.prevEl = prevEl;
    navigation.init();
    navigation.update();
  }
  if (changedParams.includes("allowSlideNext")) {
    swiper.allowSlideNext = passedParams.allowSlideNext;
  }
  if (changedParams.includes("allowSlidePrev")) {
    swiper.allowSlidePrev = passedParams.allowSlidePrev;
  }
  if (changedParams.includes("direction")) {
    swiper.changeDirection(passedParams.direction, false);
  }
  if (loopNeedDestroy || loopNeedReloop) {
    swiper.loopDestroy();
  }
  if (loopNeedEnable || loopNeedReloop) {
    swiper.loopCreate();
  }
  swiper.update();
}
function renderVirtual(swiperRef, slides, virtualData) {
  if (!virtualData)
    return null;
  const getSlideIndex = (index) => {
    let slideIndex = index;
    if (index < 0) {
      slideIndex = slides.length + index;
    } else if (slideIndex >= slides.length) {
      slideIndex = slideIndex - slides.length;
    }
    return slideIndex;
  };
  const style = swiperRef.value.isHorizontal() ? {
    [swiperRef.value.rtlTranslate ? "right" : "left"]: `${virtualData.offset}px`
  } : {
    top: `${virtualData.offset}px`
  };
  const {
    from,
    to
  } = virtualData;
  const loopFrom = swiperRef.value.params.loop ? -slides.length : 0;
  const loopTo = swiperRef.value.params.loop ? slides.length * 2 : slides.length;
  const slidesToRender = [];
  for (let i = loopFrom; i < loopTo; i += 1) {
    if (i >= from && i <= to) {
      slidesToRender.push(slides[getSlideIndex(i)]);
    }
  }
  return slidesToRender.map((slide) => {
    if (!slide.props)
      slide.props = {};
    if (!slide.props.style)
      slide.props.style = {};
    slide.props.swiperRef = swiperRef;
    slide.props.style = style;
    return h(slide.type, {
      ...slide.props
    }, slide.children);
  });
}
const updateOnVirtualData = (swiper) => {
  if (!swiper || swiper.destroyed || !swiper.params.virtual || swiper.params.virtual && !swiper.params.virtual.enabled)
    return;
  swiper.updateSlides();
  swiper.updateProgress();
  swiper.updateSlidesClasses();
  if (swiper.parallax && swiper.params.parallax && swiper.params.parallax.enabled) {
    swiper.parallax.setTranslate();
  }
};
const Swiper$1 = {
  name: "Swiper",
  props: {
    tag: {
      type: String,
      default: "div"
    },
    wrapperTag: {
      type: String,
      default: "div"
    },
    modules: {
      type: Array,
      default: void 0
    },
    init: {
      type: Boolean,
      default: void 0
    },
    direction: {
      type: String,
      default: void 0
    },
    oneWayMovement: {
      type: Boolean,
      default: void 0
    },
    touchEventsTarget: {
      type: String,
      default: void 0
    },
    initialSlide: {
      type: Number,
      default: void 0
    },
    speed: {
      type: Number,
      default: void 0
    },
    cssMode: {
      type: Boolean,
      default: void 0
    },
    updateOnWindowResize: {
      type: Boolean,
      default: void 0
    },
    resizeObserver: {
      type: Boolean,
      default: void 0
    },
    nested: {
      type: Boolean,
      default: void 0
    },
    focusableElements: {
      type: String,
      default: void 0
    },
    width: {
      type: Number,
      default: void 0
    },
    height: {
      type: Number,
      default: void 0
    },
    preventInteractionOnTransition: {
      type: Boolean,
      default: void 0
    },
    userAgent: {
      type: String,
      default: void 0
    },
    url: {
      type: String,
      default: void 0
    },
    edgeSwipeDetection: {
      type: [Boolean, String],
      default: void 0
    },
    edgeSwipeThreshold: {
      type: Number,
      default: void 0
    },
    autoHeight: {
      type: Boolean,
      default: void 0
    },
    setWrapperSize: {
      type: Boolean,
      default: void 0
    },
    virtualTranslate: {
      type: Boolean,
      default: void 0
    },
    effect: {
      type: String,
      default: void 0
    },
    breakpoints: {
      type: Object,
      default: void 0
    },
    spaceBetween: {
      type: [Number, String],
      default: void 0
    },
    slidesPerView: {
      type: [Number, String],
      default: void 0
    },
    maxBackfaceHiddenSlides: {
      type: Number,
      default: void 0
    },
    slidesPerGroup: {
      type: Number,
      default: void 0
    },
    slidesPerGroupSkip: {
      type: Number,
      default: void 0
    },
    slidesPerGroupAuto: {
      type: Boolean,
      default: void 0
    },
    centeredSlides: {
      type: Boolean,
      default: void 0
    },
    centeredSlidesBounds: {
      type: Boolean,
      default: void 0
    },
    slidesOffsetBefore: {
      type: Number,
      default: void 0
    },
    slidesOffsetAfter: {
      type: Number,
      default: void 0
    },
    normalizeSlideIndex: {
      type: Boolean,
      default: void 0
    },
    centerInsufficientSlides: {
      type: Boolean,
      default: void 0
    },
    watchOverflow: {
      type: Boolean,
      default: void 0
    },
    roundLengths: {
      type: Boolean,
      default: void 0
    },
    touchRatio: {
      type: Number,
      default: void 0
    },
    touchAngle: {
      type: Number,
      default: void 0
    },
    simulateTouch: {
      type: Boolean,
      default: void 0
    },
    shortSwipes: {
      type: Boolean,
      default: void 0
    },
    longSwipes: {
      type: Boolean,
      default: void 0
    },
    longSwipesRatio: {
      type: Number,
      default: void 0
    },
    longSwipesMs: {
      type: Number,
      default: void 0
    },
    followFinger: {
      type: Boolean,
      default: void 0
    },
    allowTouchMove: {
      type: Boolean,
      default: void 0
    },
    threshold: {
      type: Number,
      default: void 0
    },
    touchMoveStopPropagation: {
      type: Boolean,
      default: void 0
    },
    touchStartPreventDefault: {
      type: Boolean,
      default: void 0
    },
    touchStartForcePreventDefault: {
      type: Boolean,
      default: void 0
    },
    touchReleaseOnEdges: {
      type: Boolean,
      default: void 0
    },
    uniqueNavElements: {
      type: Boolean,
      default: void 0
    },
    resistance: {
      type: Boolean,
      default: void 0
    },
    resistanceRatio: {
      type: Number,
      default: void 0
    },
    watchSlidesProgress: {
      type: Boolean,
      default: void 0
    },
    grabCursor: {
      type: Boolean,
      default: void 0
    },
    preventClicks: {
      type: Boolean,
      default: void 0
    },
    preventClicksPropagation: {
      type: Boolean,
      default: void 0
    },
    slideToClickedSlide: {
      type: Boolean,
      default: void 0
    },
    loop: {
      type: Boolean,
      default: void 0
    },
    loopedSlides: {
      type: Number,
      default: void 0
    },
    loopPreventsSliding: {
      type: Boolean,
      default: void 0
    },
    rewind: {
      type: Boolean,
      default: void 0
    },
    allowSlidePrev: {
      type: Boolean,
      default: void 0
    },
    allowSlideNext: {
      type: Boolean,
      default: void 0
    },
    swipeHandler: {
      type: Boolean,
      default: void 0
    },
    noSwiping: {
      type: Boolean,
      default: void 0
    },
    noSwipingClass: {
      type: String,
      default: void 0
    },
    noSwipingSelector: {
      type: String,
      default: void 0
    },
    passiveListeners: {
      type: Boolean,
      default: void 0
    },
    containerModifierClass: {
      type: String,
      default: void 0
    },
    slideClass: {
      type: String,
      default: void 0
    },
    slideActiveClass: {
      type: String,
      default: void 0
    },
    slideVisibleClass: {
      type: String,
      default: void 0
    },
    slideNextClass: {
      type: String,
      default: void 0
    },
    slidePrevClass: {
      type: String,
      default: void 0
    },
    wrapperClass: {
      type: String,
      default: void 0
    },
    lazyPreloaderClass: {
      type: String,
      default: void 0
    },
    lazyPreloadPrevNext: {
      type: Number,
      default: void 0
    },
    runCallbacksOnInit: {
      type: Boolean,
      default: void 0
    },
    observer: {
      type: Boolean,
      default: void 0
    },
    observeParents: {
      type: Boolean,
      default: void 0
    },
    observeSlideChildren: {
      type: Boolean,
      default: void 0
    },
    a11y: {
      type: [Boolean, Object],
      default: void 0
    },
    autoplay: {
      type: [Boolean, Object],
      default: void 0
    },
    controller: {
      type: Object,
      default: void 0
    },
    coverflowEffect: {
      type: Object,
      default: void 0
    },
    cubeEffect: {
      type: Object,
      default: void 0
    },
    fadeEffect: {
      type: Object,
      default: void 0
    },
    flipEffect: {
      type: Object,
      default: void 0
    },
    creativeEffect: {
      type: Object,
      default: void 0
    },
    cardsEffect: {
      type: Object,
      default: void 0
    },
    hashNavigation: {
      type: [Boolean, Object],
      default: void 0
    },
    history: {
      type: [Boolean, Object],
      default: void 0
    },
    keyboard: {
      type: [Boolean, Object],
      default: void 0
    },
    mousewheel: {
      type: [Boolean, Object],
      default: void 0
    },
    navigation: {
      type: [Boolean, Object],
      default: void 0
    },
    pagination: {
      type: [Boolean, Object],
      default: void 0
    },
    parallax: {
      type: [Boolean, Object],
      default: void 0
    },
    scrollbar: {
      type: [Boolean, Object],
      default: void 0
    },
    thumbs: {
      type: Object,
      default: void 0
    },
    virtual: {
      type: [Boolean, Object],
      default: void 0
    },
    zoom: {
      type: [Boolean, Object],
      default: void 0
    },
    grid: {
      type: [Object],
      default: void 0
    },
    freeMode: {
      type: [Boolean, Object],
      default: void 0
    },
    enabled: {
      type: Boolean,
      default: void 0
    }
  },
  emits: ["_beforeBreakpoint", "_containerClasses", "_slideClass", "_slideClasses", "_swiper", "_freeModeNoMomentumRelease", "activeIndexChange", "afterInit", "autoplay", "autoplayStart", "autoplayStop", "autoplayPause", "autoplayResume", "autoplayTimeLeft", "beforeDestroy", "beforeInit", "beforeLoopFix", "beforeResize", "beforeSlideChangeStart", "beforeTransitionStart", "breakpoint", "changeDirection", "click", "disable", "doubleTap", "doubleClick", "destroy", "enable", "fromEdge", "hashChange", "hashSet", "init", "keyPress", "lock", "loopFix", "momentumBounce", "navigationHide", "navigationShow", "navigationPrev", "navigationNext", "observerUpdate", "orientationchange", "paginationHide", "paginationRender", "paginationShow", "paginationUpdate", "progress", "reachBeginning", "reachEnd", "realIndexChange", "resize", "scroll", "scrollbarDragEnd", "scrollbarDragMove", "scrollbarDragStart", "setTransition", "setTranslate", "slideChange", "slideChangeTransitionEnd", "slideChangeTransitionStart", "slideNextTransitionEnd", "slideNextTransitionStart", "slidePrevTransitionEnd", "slidePrevTransitionStart", "slideResetTransitionStart", "slideResetTransitionEnd", "sliderMove", "sliderFirstMove", "slidesLengthChange", "slidesGridLengthChange", "snapGridLengthChange", "snapIndexChange", "swiper", "tap", "toEdge", "touchEnd", "touchMove", "touchMoveOpposite", "touchStart", "transitionEnd", "transitionStart", "unlock", "update", "virtualUpdate", "zoomChange"],
  setup(props, _ref) {
    let {
      slots: originalSlots,
      emit
    } = _ref;
    const {
      tag: Tag2,
      wrapperTag: WrapperTag
    } = props;
    const containerClasses = ref("swiper");
    const virtualData = ref(null);
    const breakpointChanged = ref(false);
    const initializedRef = ref(false);
    const swiperElRef = ref(null);
    const swiperRef = ref(null);
    const oldPassedParamsRef = ref(null);
    const slidesRef = {
      value: []
    };
    const oldSlidesRef = {
      value: []
    };
    const nextElRef = ref(null);
    const prevElRef = ref(null);
    const paginationElRef = ref(null);
    const scrollbarElRef = ref(null);
    const {
      params: swiperParams,
      passedParams
    } = getParams(props, false);
    getChildren(originalSlots, slidesRef, oldSlidesRef);
    oldPassedParamsRef.value = passedParams;
    oldSlidesRef.value = slidesRef.value;
    const onBeforeBreakpoint = () => {
      getChildren(originalSlots, slidesRef, oldSlidesRef);
      breakpointChanged.value = true;
    };
    swiperParams.onAny = function(event) {
      for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
        args[_key - 1] = arguments[_key];
      }
      emit(event, ...args);
    };
    Object.assign(swiperParams.on, {
      _beforeBreakpoint: onBeforeBreakpoint,
      _containerClasses(swiper, classes) {
        containerClasses.value = classes;
      }
    });
    const passParams = {
      ...swiperParams
    };
    delete passParams.wrapperClass;
    swiperRef.value = new Swiper$2(passParams);
    if (swiperRef.value.virtual && swiperRef.value.params.virtual.enabled) {
      swiperRef.value.virtual.slides = slidesRef.value;
      const extendWith = {
        cache: false,
        slides: slidesRef.value,
        renderExternal: (data) => {
          virtualData.value = data;
        },
        renderExternalUpdate: false
      };
      extend(swiperRef.value.params.virtual, extendWith);
      extend(swiperRef.value.originalParams.virtual, extendWith);
    }
    onUpdated(() => {
      if (!initializedRef.value && swiperRef.value) {
        swiperRef.value.emitSlidesClasses();
        initializedRef.value = true;
      }
      const {
        passedParams: newPassedParams
      } = getParams(props, false);
      const changedParams = getChangedParams(newPassedParams, oldPassedParamsRef.value, slidesRef.value, oldSlidesRef.value, (c) => c.props && c.props.key);
      oldPassedParamsRef.value = newPassedParams;
      if ((changedParams.length || breakpointChanged.value) && swiperRef.value && !swiperRef.value.destroyed) {
        updateSwiper({
          swiper: swiperRef.value,
          slides: slidesRef.value,
          passedParams: newPassedParams,
          changedParams,
          nextEl: nextElRef.value,
          prevEl: prevElRef.value,
          scrollbarEl: scrollbarElRef.value,
          paginationEl: paginationElRef.value
        });
      }
      breakpointChanged.value = false;
    });
    provide("swiper", swiperRef);
    watch(virtualData, () => {
      nextTick(() => {
        updateOnVirtualData(swiperRef.value);
      });
    });
    onMounted(() => {
      if (!swiperElRef.value)
        return;
      mountSwiper({
        el: swiperElRef.value,
        nextEl: nextElRef.value,
        prevEl: prevElRef.value,
        paginationEl: paginationElRef.value,
        scrollbarEl: scrollbarElRef.value,
        swiper: swiperRef.value
      }, swiperParams);
      emit("swiper", swiperRef.value);
    });
    onBeforeUnmount(() => {
      if (swiperRef.value && !swiperRef.value.destroyed) {
        swiperRef.value.destroy(true, false);
      }
    });
    function renderSlides(slides) {
      if (swiperParams.virtual) {
        return renderVirtual(swiperRef, slides, virtualData.value);
      }
      slides.forEach((slide, index) => {
        if (!slide.props)
          slide.props = {};
        slide.props.swiperRef = swiperRef;
        slide.props.swiperSlideIndex = index;
      });
      return slides;
    }
    return () => {
      const {
        slides,
        slots
      } = getChildren(originalSlots, slidesRef, oldSlidesRef);
      return h(Tag2, {
        ref: swiperElRef,
        class: uniqueClasses(containerClasses.value)
      }, [slots["container-start"], h(WrapperTag, {
        class: wrapperClass(swiperParams.wrapperClass)
      }, [slots["wrapper-start"], renderSlides(slides), slots["wrapper-end"]]), needsNavigation(props) && [h("div", {
        ref: prevElRef,
        class: "swiper-button-prev"
      }), h("div", {
        ref: nextElRef,
        class: "swiper-button-next"
      })], needsScrollbar(props) && h("div", {
        ref: scrollbarElRef,
        class: "swiper-scrollbar"
      }), needsPagination(props) && h("div", {
        ref: paginationElRef,
        class: "swiper-pagination"
      }), slots["container-end"]]);
    };
  }
};
const SwiperSlide = {
  name: "SwiperSlide",
  props: {
    tag: {
      type: String,
      default: "div"
    },
    swiperRef: {
      type: Object,
      required: false
    },
    swiperSlideIndex: {
      type: Number,
      default: void 0,
      required: false
    },
    zoom: {
      type: Boolean,
      default: void 0,
      required: false
    },
    lazy: {
      type: Boolean,
      default: false,
      required: false
    },
    virtualIndex: {
      type: [String, Number],
      default: void 0
    }
  },
  setup(props, _ref) {
    let {
      slots
    } = _ref;
    let eventAttached = false;
    const {
      swiperRef
    } = props;
    const slideElRef = ref(null);
    const slideClasses = ref("swiper-slide");
    const lazyLoaded = ref(false);
    function updateClasses(swiper, el, classNames) {
      if (el === slideElRef.value) {
        slideClasses.value = classNames;
      }
    }
    onMounted(() => {
      if (!swiperRef || !swiperRef.value)
        return;
      swiperRef.value.on("_slideClass", updateClasses);
      eventAttached = true;
    });
    onBeforeUpdate(() => {
      if (eventAttached || !swiperRef || !swiperRef.value)
        return;
      swiperRef.value.on("_slideClass", updateClasses);
      eventAttached = true;
    });
    onUpdated(() => {
      if (!slideElRef.value || !swiperRef || !swiperRef.value)
        return;
      if (typeof props.swiperSlideIndex !== "undefined") {
        slideElRef.value.swiperSlideIndex = props.swiperSlideIndex;
      }
      if (swiperRef.value.destroyed) {
        if (slideClasses.value !== "swiper-slide") {
          slideClasses.value = "swiper-slide";
        }
      }
    });
    onBeforeUnmount(() => {
      if (!swiperRef || !swiperRef.value)
        return;
      swiperRef.value.off("_slideClass", updateClasses);
    });
    const slideData = computed(() => ({
      isActive: slideClasses.value.indexOf("swiper-slide-active") >= 0,
      isVisible: slideClasses.value.indexOf("swiper-slide-visible") >= 0,
      isPrev: slideClasses.value.indexOf("swiper-slide-prev") >= 0,
      isNext: slideClasses.value.indexOf("swiper-slide-next") >= 0
    }));
    provide("swiperSlide", slideData);
    const onLoad = () => {
      lazyLoaded.value = true;
    };
    return () => {
      return h(props.tag, {
        class: uniqueClasses(`${slideClasses.value}`),
        ref: slideElRef,
        "data-swiper-slide-index": typeof props.virtualIndex === "undefined" && swiperRef && swiperRef.value && swiperRef.value.params.loop ? props.swiperSlideIndex : props.virtualIndex,
        onLoadCapture: onLoad
      }, props.zoom ? h("div", {
        class: "swiper-zoom-container",
        "data-swiper-zoom": typeof props.zoom === "number" ? props.zoom : void 0
      }, [slots.default && slots.default(slideData.value), props.lazy && !lazyLoaded.value && h("div", {
        class: "swiper-lazy-preloader"
      })]) : [slots.default && slots.default(slideData.value), props.lazy && !lazyLoaded.value && h("div", {
        class: "swiper-lazy-preloader"
      })]);
    };
  }
};
const modules = [Pagination, Autoplay, Controller];
const __vue_sfc__$6 = defineComponent({
  name: createNamespace("Swiper")[0],
  components: {
    FanAspectRatio: stdin_default$F,
    FanImage: stdin_default$C,
    Swiper: Swiper$1,
    SwiperSlide
  },
  props: swiperProps,
  emits: swiperEmits,
  setup(props, context) {
    const swiperVisible = ref(true);
    const innerCurrent = ref(props.current);
    const { swiperWidth, swiperAspectRatio } = useSwiperState(props);
    const refSwiper = ref(null);
    const setControlledSwiper = (swiper) => {
      refSwiper.value = swiper;
    };
    const getSwiperWidth = () => {
      const { type } = props;
      if (type !== 2)
        return;
      setTimeout(() => {
        if (!refSwiper.value)
          return;
        swiperWidth.value = refSwiper.value.width;
      }, 0);
    };
    onMounted(getSwiperWidth);
    watch(() => props.customStyle, getSwiperWidth);
    const _initialSlide = props.current;
    const swiperOptions = computed(() => {
      const { autoplay, type, loop, autoHeight, vertical } = props;
      return {
        autoplay: !autoplay ? false : { delay: autoplay, disableOnInteraction: false },
        autoHeight,
        loop,
        speed: props.duration,
        centeredSlides: true,
        initialSlide: _initialSlide,
        slidesPerView: type === 2 ? "auto" : 1,
        loopedSlides: type === 2 ? 5 : null,
        pagination: { el: ".swiper-pagination" },
        direction: vertical ? "vertical" : "horizontal"
      };
    });
    const resetSwiper = () => {
      swiperVisible.value = false;
      nextTick(() => {
        swiperVisible.value = true;
      });
    };
    const updateAutoHeight = () => {
      setTimeout(() => {
        refSwiper.value.updateAutoHeight();
      }, 0);
    };
    watch(
      () => props.type,
      (val, prevVal) => {
        val !== prevVal && resetSwiper();
      }
    );
    watch(
      () => props.current,
      (val) => {
        if (val !== innerCurrent.value)
          innerCurrent.value = val;
      }
    );
    watch(innerCurrent, (val, prevVal) => {
      var _a, _b;
      if (val === prevVal)
        return;
      context.emit("update:current", val);
      context.emit("change", val);
      props.loop ? (_a = refSwiper.value) == null ? void 0 : _a.slideToLoop(val) : (_b = refSwiper.value) == null ? void 0 : _b.slideTo(val);
    });
    const showSlot = computed(() => {
      return props.customItem || context.slots.default;
    });
    const onClick = (e, i) => {
      context.emit("click", e, i);
    };
    const slideChange = (e) => {
      innerCurrent.value = e.realIndex;
    };
    return {
      modules,
      swiperVisible,
      swiperOptions,
      innerCurrent,
      setControlledSwiper,
      slideChange,
      swiperAspectRatio,
      showSlot,
      onClick,
      updateAutoHeight
    };
  }
});
function __vue_render__$6(_ctx, _cache) {
  const _component_FanImage = resolveComponent("FanImage");
  const _component_SwiperSlide = resolveComponent("SwiperSlide");
  const _component_Swiper = resolveComponent("Swiper", true);
  const _component_FanAspectRatio = resolveComponent("FanAspectRatio");
  return _ctx.list && _ctx.list.length ? (openBlock(), createBlock(_component_FanAspectRatio, {
    key: 0,
    style: normalizeStyle(_ctx.customStyle),
    "aspect-ratio": _ctx.swiperAspectRatio
  }, {
    default: withCtx(() => [
      _ctx.swiperVisible ? (openBlock(), createBlock(_component_Swiper, mergeProps({
        key: 0,
        modules: _ctx.modules,
        class: ["fan-swiper__inner", {
          "fan-swiper--type2": _ctx.type === 2,
          "fan-swiper--vertical": _ctx.vertical
        }]
      }, _ctx.swiperOptions, {
        onSwiper: _ctx.setControlledSwiper,
        onSlideChange: _ctx.slideChange
      }), {
        default: withCtx(() => [
          (openBlock(true), createElementBlock(
            Fragment,
            null,
            renderList(_ctx.list, (item, index) => {
              return openBlock(), createBlock(
                _component_SwiperSlide,
                { key: index },
                {
                  default: withCtx(() => [
                    _ctx.showSlot ? renderSlot(_ctx.$slots, "default", {
                      key: 0,
                      item,
                      index,
                      active: index === _ctx.innerCurrent
                    }) : (openBlock(), createBlock(_component_FanImage, {
                      key: 1,
                      src: item.cover,
                      mode: _ctx.autoHeight ? "widthFix" : "aspectFill",
                      "aspect-ratio": _ctx.autoHeight ? 0 : _ctx.aspectRatio,
                      radius: _ctx.innerRadius,
                      onClick: ($event) => _ctx.onClick(item, index)
                    }, null, 8, ["src", "mode", "aspect-ratio", "radius", "onClick"]))
                  ]),
                  _: 2
                  /* DYNAMIC */
                },
                1024
                /* DYNAMIC_SLOTS */
              );
            }),
            128
            /* KEYED_FRAGMENT */
          )),
          _ctx.indicator ? (openBlock(), createElementBlock(
            "div",
            {
              key: 0,
              style: normalizeStyle({ "--swiper-pagination-color": _ctx.indicatorActiveColor }),
              class: "swiper-pagination",
              slot: "pagination"
            },
            null,
            4
            /* STYLE */
          )) : createCommentVNode("v-if", true)
        ]),
        _: 3
        /* FORWARDED */
      }, 16, ["modules", "class", "onSwiper", "onSlideChange"])) : createCommentVNode("v-if", true)
    ]),
    _: 3
    /* FORWARDED */
  }, 8, ["style", "aspect-ratio"])) : createCommentVNode("v-if", true);
}
__vue_sfc__$6.render = __vue_render__$6;
var stdin_default$7 = __vue_sfc__$6;
const Swiper = stdin_default$7;
const switchSfc = "";
const __vue_sfc__$5 = defineComponent({
  name: createNamespace("Switch")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["update:modelValue", "change"],
  props: {
    modelValue: {
      type: Boolean,
      default: false
    },
    disabled: {
      type: Boolean,
      default: false
    },
    color: {
      type: String,
      default: "#04BE02"
    },
    size: {
      type: [String, Number],
      default: 30
    }
  },
  setup(props, { emit }) {
    const innerShow = ref(props.modelValue);
    watch(
      () => props.modelValue,
      (val) => innerShow.value = val
    );
    const theStyle = computed(() => {
      const { size, color } = props;
      const s = `font-size: ${transformSize(
        size
      )};--fan-switch--color: ${color};`;
      return s;
    });
    const onClick = () => {
      if (props.disabled)
        return;
      innerShow.value = innerShow.value ? false : true;
      emit("update:modelValue", innerShow.value);
      emit("change", innerShow.value);
    };
    return { innerShow, theStyle, onClick };
  }
});
function __vue_render__$5(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: normalizeClass(["fan-switch", [{ "fan-switch__on": _ctx.innerShow }, { "fan-switch__d": _ctx.disabled }]]),
      onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args)),
      style: normalizeStyle(_ctx.theStyle)
    },
    _cache[1] || (_cache[1] = [
      createElementVNode(
        "div",
        { class: "fan-switch__node" },
        null,
        -1
        /* HOISTED */
      )
    ]),
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$5.render = __vue_render__$5;
var stdin_default$6 = __vue_sfc__$5;
const Switch = stdin_default$6;
const tabsSfc = "";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b2) => {
  for (var prop in b2 || (b2 = {}))
    if (__hasOwnProp.call(b2, prop))
      __defNormalProp(a, prop, b2[prop]);
  if (__getOwnPropSymbols)
    for (var prop of __getOwnPropSymbols(b2)) {
      if (__propIsEnum.call(b2, prop))
        __defNormalProp(a, prop, b2[prop]);
    }
  return a;
};
var __spreadProps = (a, b2) => __defProps(a, __getOwnPropDescs(b2));
var __async = (__this, __arguments, generator) => {
  return new Promise((resolve, reject) => {
    var fulfilled = (value) => {
      try {
        step(generator.next(value));
      } catch (e) {
        reject(e);
      }
    };
    var rejected = (value) => {
      try {
        step(generator.throw(value));
      } catch (e) {
        reject(e);
      }
    };
    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
    step((generator = generator.apply(__this, __arguments)).next());
  });
};
const __vue_sfc__$4 = defineComponent({
  name: createNamespace("Tabs")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanScrollView: stdin_default$q },
  props: {
    /**
     * 数据
     */
    tabs: Array,
    /**
     * 绑定当前选中标签的标识符，可以结合 valueProp 设置成 tabs-item 中指定字段
     * @default tabs-index
     */
    active: {
      type: [Number, String],
      default: 0
    },
    /**
     * tab-title 取值，默认直接 tabs-item
     */
    labelProp: String,
    /**
     * label/标题左右padding
     */
    labelPad: {
      type: [Number, String],
      default: 12
    },
    /**
     * 两侧padding，默认 labelPad / 2
     */
    sidePad: [String, Number],
    /**
     * active 的值的来源
     */
    valueProp: String,
    /**
     * 滚动阈值，标签数量超过阈值且总宽度超过标签栏宽度时开始横向滚动
     */
    scrollThreshold: {
      type: Number,
      default: 4
    },
    // 中心偏移，单位 px，当其值在 0 < x < 1 时为容器盒子宽度的占比，可以为负数
    offCentering: {
      type: Number,
      default: 0
    },
    /**
     * 是否开启左侧收缩布局
     */
    shrink: {
      type: Boolean,
      default: false
    },
    height: {
      type: [String, Number],
      default: 40
    },
    bg: {
      type: String,
      default: "white"
    },
    color: {
      type: String
    },
    activeColor: {
      type: String
    },
    /**
     * 选中时是否加粗放大
     */
    activeStrong: {
      type: Boolean,
      default: false
    },
    activeStyle: [String, Object],
    textSize: {
      type: [String, Number]
    },
    /**
     * 选中内容是否可以超出盒子
     */
    activeOut: {
      type: Boolean,
      default: false
    },
    /**
     * 是否显示指示器
     */
    indicator: {
      type: Boolean,
      default: true
    },
    indicatorHeight: {
      type: [String, Number],
      default: 2
    },
    indicatorWidth: {
      type: [String, Number],
      default: "auto"
    },
    indicatorLeft: {
      type: Number,
      default: 0
    },
    indicatorColor: String,
    indicatorStyle: [String, Object],
    /**
     * 是否显示边框，true = 'bottom'，设置为 false 则不显示
     */
    border: {
      type: [Boolean, String],
      default: true,
      validator: (value) => [true, false, "bottom", "top", "vertical"].includes(value)
    }
  },
  emits: ["update:active", "change", "click"],
  setup(props, context) {
    const uniqueId = createUniqueId({ prefix: "fanTabs" });
    const items = computed(() => {
      return (props.tabs || []).map((a, i) => {
        return __spreadProps(__spreadValues({}, typeof a === "object" ? a : null), {
          label: !props.labelProp ? a : a[props.labelProp],
          value: !props.valueProp ? i : a[props.valueProp]
        });
      });
    });
    const itemRects = ref([]);
    const scrollWidth = ref(320);
    const _this = getCurrentInstance();
    let getTabsRectsNum = 0;
    const getTabsRects = () => __async(this, null, function* () {
      getTabsRectsNum++;
      if (items.value.length) {
        itemRects.value = yield getElementBounding({
          selector: ".fan2-tab__in",
          selectAll: true,
          scope: _this
        });
      } else if (itemRects.value.length)
        itemRects.value = [];
    });
    const getRects = () => __async(this, null, function* () {
      yield getTabsRects();
      if (itemRects.value.length && getTabsRectsNum <= 2) {
        const item = itemRects.value.filter(
          (item2) => item2.height === 0 && item2.width === 0
        );
        if (!item.length)
          return;
        setTimeout(() => {
          getTabsRects();
        }, 300);
      }
      const scrollRect = yield getElementBounding({
        selector: "#" + uniqueId,
        scope: _this
      });
      if (scrollRect == null ? void 0 : scrollRect.width)
        scrollWidth.value = scrollRect.width + (scrollRect.left || 0) * 2;
    });
    const activeIndex = computed(() => {
      const i = items.value.findIndex((a) => a.value === props.active);
      return i !== -1 ? i : 0;
    });
    const theStyle = computed(() => {
      const {
        height,
        bg,
        color,
        textSize,
        activeColor,
        labelPad,
        sidePad
      } = props;
      const tabPad = transformSize(labelPad);
      const sPad = !sidePad ? `calc(${tabPad} / 2)` : transformSize(sidePad);
      let s = `--fan2-tabs-height:${transformSize(
        height
      )};--fan2-tab-pad:${tabPad};--fan2-tabs-side-pad:${sPad};`;
      if (color)
        s += `--fan2-tabs-color:${color};`;
      if (activeColor)
        s += `--fan2-tabs-active-color:${activeColor};`;
      if (bg)
        s += `background:${bg};`;
      if (textSize)
        s += `font-size:${transformSize(textSize)};`;
      return s;
    });
    const theActiveStyle = computed(
      () => transformStyleSize(props.activeStyle)
    );
    const zsqStyle = computed(() => {
      const {
        indicator,
        indicatorHeight,
        indicatorWidth,
        indicatorColor,
        indicatorStyle,
        activeStrong,
        indicatorLeft
      } = props;
      if (!indicator)
        return "";
      let s = "";
      const tab = itemRects.value[activeIndex.value];
      const { left = 6, width = 52 } = tab || {};
      s += `transform:translateX(${left + width / 2 - indicatorLeft}px) translateX(calc(-50%));`;
      if (indicatorWidth) {
        if (indicatorWidth === "auto")
          s += `width:calc((${width}px - var(--fan2-tab-pad) * 2) * ${activeStrong ? 1.13 : 1});`;
        else
          s += `width:calc(${transformSize(indicatorWidth)} * ${activeStrong ? 1.13 : 1});`;
      }
      if (indicatorHeight) {
        const h2 = transformSize(indicatorHeight);
        s += `height:${h2};top:calc(var(--fan2-tabs-height) - ${h2});`;
      }
      if (indicatorColor)
        s += `background-color:${indicatorColor};`;
      return transformStyleSize(indicatorStyle) + s;
    });
    const borderTop = computed(() => {
      return ["top", "vertical"].includes(props.border);
    });
    const borderBottom = computed(() => {
      return [true, "bottom", "vertical"].includes(props.border);
    });
    const scrollable = computed(() => {
      const length = items.value.length;
      const over = length > props.scrollThreshold;
      if (length !== itemRects.value.length)
        return over;
      const width = itemRects.value.reduce((sum, item) => {
        return sum + item.width;
      }, 0);
      return over && width > scrollWidth.value;
    });
    const scrollLeft = ref(0);
    const scrollToItem = (index) => {
      var _a;
      if (!scrollable.value)
        return;
      const tab = itemRects.value[index];
      if (!tab)
        return;
      let padding = ((_a = itemRects.value[0]) == null ? void 0 : _a.left) || 0;
      padding = 0;
      const offset = Math.abs(props.offCentering) < 1 ? scrollWidth.value * props.offCentering : props.offCentering;
      scrollLeft.value = tab.left - padding + tab.width / 2 - scrollWidth.value / 2 - offset;
    };
    watch(activeIndex, (val) => {
      scrollToItem(val);
    });
    const itemClick = (index) => {
      const item = items.value[index];
      context.emit("click", props.tabs[index], index);
      if (item.value !== props.active) {
        context.emit("update:active", item.value);
        context.emit("change", props.tabs[index], index);
      }
    };
    onMounted(() => getRects());
    watch([items, scrollable], () => {
      nextTick(getRects);
    });
    return {
      uniqueId,
      items,
      scrollable,
      scrollLeft,
      theStyle,
      theActiveStyle,
      zsqStyle,
      borderTop,
      borderBottom,
      itemClick
    };
  }
});
const _hoisted_1$3 = ["id"];
const _hoisted_2$2 = ["onClick"];
const _hoisted_3$1 = { class: "fan2-tab__in" };
const _hoisted_4$1 = { key: 0 };
function __vue_render__$4(_ctx, _cache) {
  const _component_FanScrollView = resolveComponent("FanScrollView");
  return openBlock(), createElementBlock("div", {
    id: _ctx.uniqueId,
    style: normalizeStyle(_ctx.theStyle),
    class: normalizeClass(["fan2-tabs", {
      "fan-hairline--top": _ctx.borderTop,
      "fan-hairline--bottom": _ctx.borderBottom,
      "fan2-tabs--flex": !_ctx.scrollable && !_ctx.shrink,
      "fan2-tabs--out": _ctx.activeOut
    }])
  }, [
    createVNode(_component_FanScrollView, {
      style: normalizeStyle([{ "position": "relative" }, _ctx.activeOut ? { overflow: "visible" } : ""]),
      height: "calc(100% + 17px)",
      "scroll-x": true,
      "scroll-y": _ctx.activeOut,
      "scroll-left": _ctx.scrollLeft,
      "enable-flex": !_ctx.scrollable,
      scrollable: _ctx.scrollable,
      scrollWithAnimation: true
    }, {
      default: withCtx(() => [
        _cache[0] || (_cache[0] = createElementVNode(
          "div",
          { class: "fan2-tab__pad" },
          null,
          -1
          /* HOISTED */
        )),
        (openBlock(true), createElementBlock(
          Fragment,
          null,
          renderList(_ctx.items, (item, index) => {
            return openBlock(), createElementBlock("div", {
              key: index,
              style: normalizeStyle(item.value === _ctx.active ? _ctx.theActiveStyle : ""),
              class: normalizeClass(["fan2-tab", {
                "fan2-tab--active": item.value === _ctx.active,
                "fan2-tab--strong": _ctx.activeStrong,
                "fan2-tab--out": _ctx.activeOut
              }]),
              onClick: ($event) => _ctx.itemClick(index)
            }, [
              createElementVNode("div", _hoisted_3$1, [
                !_ctx.$slots.default ? (openBlock(), createElementBlock(
                  "span",
                  _hoisted_4$1,
                  toDisplayString(item.label),
                  1
                  /* TEXT */
                )) : renderSlot(_ctx.$slots, "default", {
                  key: 1,
                  item,
                  index,
                  active: item.value === _ctx.active
                })
              ])
            ], 14, _hoisted_2$2);
          }),
          128
          /* KEYED_FRAGMENT */
        )),
        _cache[1] || (_cache[1] = createElementVNode(
          "div",
          { class: "fan2-tab__pad" },
          null,
          -1
          /* HOISTED */
        )),
        createElementVNode(
          "div",
          {
            style: normalizeStyle(_ctx.zsqStyle),
            class: "fan2-tabs__indicator"
          },
          null,
          4
          /* STYLE */
        )
      ]),
      _: 3
      /* FORWARDED */
    }, 8, ["scroll-y", "scroll-left", "enable-flex", "scrollable", "style"])
  ], 14, _hoisted_1$3);
}
__vue_sfc__$4.render = __vue_render__$4;
var stdin_default$5 = __vue_sfc__$4;
const Tabs = stdin_default$5;
const tagSfc = "";
const __vue_sfc__$3 = defineComponent({
  name: createNamespace("Tag")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  emits: ["click"],
  props: {
    color: String,
    bg: String,
    width: String,
    height: String,
    margin: String,
    padding: String,
    textSize: {
      type: [String, Number]
    },
    textColor: String,
    bold: [Boolean, String],
    /**
     * 是否为朴素模式
     */
    plain: {
      type: Boolean,
      default: false
    },
    /**
     * 是否有边框，plain朴素时生效
     */
    border: {
      type: Boolean,
      default: true
    },
    /**
     * 边框颜色，默认为 color
     */
    borderColor: String,
    /**
     * 圆角
     */
    radius: [String, Number],
    /**
     * 是否使用 0.5px 边框
     */
    hairline: {
      type: Boolean,
      default: false
    }
  },
  setup(props, context) {
    const theStyle = computed(() => {
      const { color, bg: background, plain, textSize, textColor, radius, borderColor } = props;
      const obj = {};
      ["width", "height", "padding", "margin"].forEach((k) => props[k] && (obj[k] = props[k]));
      const bg = background || (plain ? "white" : color);
      if (bg)
        obj["--fan2-tag-bg"] = bg;
      const c = textColor || (plain ? color || "var(--fan-primary-color)" : !color ? "" : "white");
      if (c)
        obj["--fan2-tag-text-color"] = c;
      if (textSize)
        obj.fontSize = transformSize(textSize);
      if (plain && (color || borderColor))
        obj["--fan2-tag-border-color"] = borderColor || color;
      if (radius || radius === 0)
        obj["--fan2-tag-border-radius"] = radius;
      return transformStyleSize(obj);
    });
    const inStyle = computed(() => {
      let s = "max-width:100%;";
      if (props.textSize)
        s += `font-size:${transformSize(props.textSize)}`;
      return s;
    });
    const onClick = (e) => {
      context.emit("click", e);
    };
    return { theStyle, inStyle, onClick };
  }
});
const _hoisted_1$2 = {
  key: 0,
  class: "fan2-tag__hairline"
};
function __vue_render__$3(_ctx, _cache) {
  return openBlock(), createElementBlock(
    "div",
    {
      class: normalizeClass(["fan2-tag", {
        "fan2-tag--noborder": !_ctx.border,
        "fan2-tag--hairline": _ctx.hairline,
        "fan2-tag--plain": _ctx.plain,
        "fan2-tag--bold": _ctx.bold
      }]),
      style: normalizeStyle(_ctx.theStyle),
      onClick: _cache[0] || (_cache[0] = (...args) => _ctx.onClick && _ctx.onClick(...args))
    },
    [
      createCommentVNode(" fix：uniapp-App-伪元素超不出100% "),
      _ctx.hairline ? (openBlock(), createElementBlock("div", _hoisted_1$2)) : createCommentVNode("v-if", true),
      createElementVNode(
        "div",
        {
          style: normalizeStyle(_ctx.inStyle),
          class: "fan-ellipsis"
        },
        [
          renderSlot(_ctx.$slots, "default")
        ],
        4
        /* STYLE */
      )
    ],
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$3.render = __vue_render__$3;
var stdin_default$4 = __vue_sfc__$3;
const Tag = stdin_default$4;
const Text = stdin_default$u;
const textareaSfc = "";
const __vue_sfc__$2 = defineComponent({
  name: createNamespace("Textarea")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanIcon: stdin_default$K },
  props: {
    label: String,
    labelStyle: String,
    inputStyle: String,
    limitStyle: String,
    placeholder: String,
    placeholderColor: {
      type: String,
      default: "#C4C7CC"
    },
    readonly: {
      type: [Boolean, String],
      default: false
    },
    disabled: {
      type: [Boolean, String],
      default: false
    },
    modelValue: {
      type: [String, Number],
      default: ""
    },
    maxLength: {
      type: [String, Number],
      default: -1
    },
    showWordLimit: {
      type: Boolean,
      default: false
    },
    prefixIcon: String,
    prefixColor: {
      type: String,
      default: "var(--fan-black-2)"
    },
    prefixSize: {
      type: [String, Number],
      default: 17
    },
    border: {
      type: [Boolean, String],
      default: false
    }
  },
  emits: ["update:modelValue", "input", "change", "confirm", "blur", "focus"],
  setup(props, { emit }) {
    const theStyle = computed(() => {
      return `--fan-textarea-placeholder-color:${props.placeholderColor};`;
    });
    const labStyle = computed(() => transformStyleSize(props.labelStyle));
    const inStyle = computed(() => transformStyleSize(props.inputStyle));
    const limStyle = computed(() => transformStyleSize(props.limitStyle));
    const innerValue = ref("");
    watch(innerValue, (val) => {
      if (val !== props.modelValue)
        emit("update:modelValue", val);
      emit("input", val);
    });
    watch(
      () => props.modelValue,
      (val) => {
        if (val !== innerValue.value)
          innerValue.value = val;
      },
      { immediate: true }
    );
    const handleInput = (e) => innerValue.value = getInputValue(e);
    const onFocus = (e) => emit("focus", e);
    const onBlur = (e) => emit("blur", e);
    const handleChange = (e) => emit(e, innerValue.value);
    return {
      theStyle,
      labStyle,
      inStyle,
      limStyle,
      innerValue,
      handleInput,
      onFocus,
      onBlur,
      handleChange
    };
  }
});
const _hoisted_1$1 = { class: "fan-textarea__wrap" };
const _hoisted_2$1 = ["maxlength", "value", "placeholder-style", "placeholder", "readonly", "disabled"];
function __vue_render__$2(_ctx, _cache) {
  const _component_FanIcon = resolveComponent("FanIcon");
  return openBlock(), createElementBlock(
    "div",
    {
      style: normalizeStyle(_ctx.theStyle),
      class: normalizeClass(["fan-textarea__body", { "fan-hairline--bottom": _ctx.border }])
    },
    [
      createElementVNode("div", _hoisted_1$1, [
        _ctx.prefixIcon ? (openBlock(), createBlock(_component_FanIcon, {
          key: 0,
          name: _ctx.prefixIcon,
          color: _ctx.prefixColor,
          size: _ctx.prefixSize,
          style: { "margin-right": "4px" }
        }, null, 8, ["name", "color", "size"])) : createCommentVNode("v-if", true),
        _ctx.label ? (openBlock(), createElementBlock(
          "div",
          {
            key: 1,
            style: normalizeStyle(_ctx.labStyle),
            class: "fan-textarea__label"
          },
          toDisplayString(_ctx.label),
          5
          /* TEXT, STYLE */
        )) : createCommentVNode("v-if", true),
        createElementVNode("textarea", {
          class: normalizeClass(["fan-textarea", { "fan-textarea--disabled": _ctx.disabled }]),
          maxlength: _ctx.maxLength,
          style: normalizeStyle(_ctx.inStyle),
          value: _ctx.innerValue,
          "placeholder-style": `color:${_ctx.placeholderColor};`,
          placeholder: _ctx.placeholder,
          readonly: _ctx.readonly,
          disabled: _ctx.disabled || _ctx.readonly,
          onInput: _cache[0] || (_cache[0] = (...args) => _ctx.handleInput && _ctx.handleInput(...args)),
          onBlur: _cache[1] || (_cache[1] = (...args) => _ctx.onBlur && _ctx.onBlur(...args)),
          onFocus: _cache[2] || (_cache[2] = (...args) => _ctx.onFocus && _ctx.onFocus(...args)),
          onChange: _cache[3] || (_cache[3] = ($event) => _ctx.handleChange("change")),
          onKeyup: _cache[4] || (_cache[4] = withKeys(($event) => _ctx.handleChange("confirm"), ["enter"])),
          onConfirm: _cache[5] || (_cache[5] = ($event) => _ctx.handleChange("confirm"))
        }, null, 46, _hoisted_2$1)
      ]),
      _ctx.maxLength > 0 && _ctx.showWordLimit ? (openBlock(), createElementBlock(
        "div",
        {
          key: 0,
          style: normalizeStyle(_ctx.limStyle),
          class: "fan-textarea__limit"
        },
        toDisplayString(_ctx.innerValue.length > _ctx.maxLength ? _ctx.maxLength : _ctx.innerValue.length) + "/" + toDisplayString(_ctx.maxLength > 0 ? _ctx.maxLength : 0),
        5
        /* TEXT, STYLE */
      )) : createCommentVNode("v-if", true)
    ],
    6
    /* CLASS, STYLE */
  );
}
__vue_sfc__$2.render = __vue_render__$2;
var stdin_default$3 = __vue_sfc__$2;
const Textarea = stdin_default$3;
const __vue_sfc__$1 = defineComponent({
  name: createNamespace("TimePicker")[0],
  options: { virtualHost: true },
  emits: ["update:show", "update:modelValue", "confirm", "cancel"],
  components: { FanPicker: stdin_default$s },
  props: {
    modelValue: {
      type: Array,
      default: () => []
    },
    show: {
      type: Boolean,
      default: false
    },
    title: String,
    filter: {
      type: [Function, null],
      default: null
    },
    cancelText: {
      type: String,
      default: "取消"
    },
    confirmText: {
      type: String,
      default: "确认"
    },
    second: {
      type: Boolean,
      default: false
    }
  },
  setup(props, { emit }) {
    const formatTime = (val, type) => {
      let arr = Array.from({ length: val }, (_, index) => index < 10 ? `0${index}` : index);
      if (props.filter)
        arr = props.filter(type, arr);
      arr = arr.map((item, index) => ({ text: item, id: index < 10 ? `0${index}` : String(index), index }));
      return arr;
    };
    const state = reactive({
      innerShow: props.show,
      value: props.modelValue,
      hours: formatTime(24, "hours"),
      minute: formatTime(60, "minute"),
      second: formatTime(60, "second")
    });
    const list = computed(() => {
      let l = [state.hours, state.minute];
      if (props.second)
        l.push(state.second);
      return l;
    });
    const onConfirm = (val) => emit("confirm", val);
    const onCancel = (val) => emit("cancel");
    watch(props.modelValue, (val) => {
      state.value = [...val];
    }, { deep: true });
    watch(() => state.value, (val) => {
      emit("update:modelValue", val);
    }, { deep: true });
    watch(() => props.show, (val) => state.innerShow = val);
    watch(() => state.innerShow, (val) => emit("update:show", val));
    return { state, list, onConfirm, onCancel };
  }
});
function __vue_render__$1(_ctx, _cache) {
  const _component_FanPicker = resolveComponent("FanPicker");
  return openBlock(), createBlock(_component_FanPicker, {
    modelValue: _ctx.state.value,
    "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => _ctx.state.value = $event),
    show: _ctx.state.innerShow,
    "onUpdate:show": _cache[1] || (_cache[1] = ($event) => _ctx.state.innerShow = $event),
    data: _ctx.list,
    "value-key": "id",
    title: _ctx.title,
    "cancel-text": _ctx.cancelText,
    "confirm-text": _ctx.confirmText,
    onConfirm: _ctx.onConfirm,
    onCancel: _ctx.onCancel
  }, createSlots({
    _: 2
    /* DYNAMIC */
  }, [
    _ctx.$slots.default ? {
      name: "header",
      fn: withCtx(() => [
        renderSlot(_ctx.$slots, "default")
      ]),
      key: "0"
    } : void 0
  ]), 1032, ["modelValue", "show", "data", "title", "cancel-text", "confirm-text", "onConfirm", "onCancel"]);
}
__vue_sfc__$1.render = __vue_render__$1;
var stdin_default$2 = __vue_sfc__$1;
const TimePicker = stdin_default$2;
const Toast = stdin_default$I;
const userPanelSfc = "";
const __vue_sfc__ = defineComponent({
  name: createNamespace("UserPanel")[0],
  options: {
    // https://uniapp.dcloud.io/matter.html#mp
    virtualHost: true
  },
  components: { FanImage: stdin_default$C, FanLoading: stdin_default$J, FanRichText: stdin_default$a },
  props: {
    hasLogin: {
      type: Boolean,
      default: false
    },
    loading: {
      type: Boolean,
      default: false
    },
    avatar: {
      type: String,
      default: "https://img.dac6.cn/resource/avatar.png"
    },
    name: {
      type: String,
      default: "用户昵称"
    },
    role: String,
    vip: Boolean,
    desc: String
  },
  emits: ["click"]
});
const _hoisted_1 = { class: "fan-upanel" };
const _hoisted_2 = {
  key: 0,
  class: "fan-flex-1 fan-flex"
};
const _hoisted_3 = {
  key: 1,
  class: "fan-flex-1"
};
const _hoisted_4 = {
  class: "fan-flex fan-align-center",
  style: { "flex-wrap": "nowrap" }
};
const _hoisted_5 = { class: "fan-ellipsis fan-upanel__name" };
const _hoisted_6 = {
  key: 2,
  class: "fan-flex-1"
};
function __vue_render__(_ctx, _cache) {
  const _component_FanImage = resolveComponent("FanImage");
  const _component_FanLoading = resolveComponent("FanLoading");
  const _component_FanRichText = resolveComponent("FanRichText");
  return openBlock(), createElementBlock("div", _hoisted_1, [
    createElementVNode("div", {
      class: "fan-flex-center fan-upanel__in",
      onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click"))
    }, [
      createVNode(_component_FanImage, {
        width: "60px",
        height: "60px",
        src: _ctx.avatar,
        mode: "aspectFill",
        radius: "50%",
        style: { marginRight: "15px" }
      }, null, 8, ["src"]),
      _ctx.hasLogin && _ctx.loading ? (openBlock(), createElementBlock("div", _hoisted_2, [
        createVNode(_component_FanLoading, {
          type: "line",
          color: "var(--fan-primary-color)"
        })
      ])) : _ctx.hasLogin ? (openBlock(), createElementBlock("div", _hoisted_3, [
        createElementVNode("div", _hoisted_4, [
          createElementVNode(
            "div",
            _hoisted_5,
            toDisplayString(_ctx.name),
            1
            /* TEXT */
          ),
          _ctx.role ? (openBlock(), createElementBlock(
            "div",
            {
              key: 0,
              class: normalizeClass(["fan-upanel__role", { vip: _ctx.vip }])
            },
            toDisplayString(_ctx.role),
            3
            /* TEXT, CLASS */
          )) : createCommentVNode("v-if", true)
        ]),
        _ctx.desc ? (openBlock(), createBlock(_component_FanRichText, {
          key: 0,
          class: "fan-upanel__desc",
          content: _ctx.desc
        }, null, 8, ["content"])) : createCommentVNode("v-if", true)
      ])) : (openBlock(), createElementBlock("div", _hoisted_6, _cache[1] || (_cache[1] = [
        createElementVNode(
          "div",
          {
            class: "fan-flex fan-align-center",
            style: { "flex-wrap": "nowrap" }
          },
          [
            createElementVNode("div", { class: "fan-ellipsis fan-upanel__name" }, "点击登录")
          ],
          -1
          /* HOISTED */
        ),
        createElementVNode(
          "div",
          { class: "fan-upanel__desc" },
          "登录后解锁更多实用功能",
          -1
          /* HOISTED */
        )
      ])))
    ])
  ]);
}
__vue_sfc__.render = __vue_render__;
var stdin_default$1 = __vue_sfc__;
const UserPanel = stdin_default$1;
const version = "2.0.20";
function install(app) {
  const components = [
    AspectRatio,
    Button,
    Cell,
    Checkbox,
    Config,
    ContactButton,
    ContactPanel,
    CountDown,
    CountTo,
    DataPanel,
    DatePicker,
    Dialog,
    DropdownItem,
    DropdownMenu,
    Empty,
    Icon,
    Image,
    Input,
    InputGrid,
    InputNumber,
    Lazyload,
    List,
    Loading,
    LoadingView,
    NavBar,
    NoticeBar,
    Overlay,
    Picker,
    Popup,
    PositionedView,
    Price,
    PullRefresh,
    Rate,
    RichText,
    ScrollView,
    Search,
    Sticky,
    Swiper,
    Switch,
    Tabs,
    Tag,
    Text,
    Textarea,
    TimePicker,
    Toast,
    UserPanel
  ];
  components.forEach((item) => {
    if (item.install) {
      app.use(item);
    } else if (item.name) {
      app.component(item.name, item);
    }
  });
}
var stdin_default = {
  install,
  version
};
export {
  AspectRatio,
  Button,
  Cell,
  Checkbox,
  Config,
  ContactButton,
  ContactPanel,
  CountDown,
  CountTo,
  DataPanel,
  DatePicker,
  Dialog,
  DropdownItem,
  DropdownMenu,
  Empty,
  Icon,
  Image,
  Input,
  InputGrid,
  InputNumber,
  Lazyload,
  List,
  ListStatus,
  Loading,
  LoadingView,
  NavBar,
  NoticeBar,
  Overlay,
  Picker,
  Popup,
  PositionedView,
  Price,
  PullRefresh,
  Rate,
  RichText,
  ScrollView,
  Search,
  Sticky,
  Swiper,
  Switch,
  Tabs,
  Tag,
  Text,
  Textarea,
  TimePicker,
  Toast,
  UserPanel,
  stdin_default as default,
  install,
  version
};
